YAMAGUCHI::weblogスマートフォン用の表示で見るYAMAGUCHI::weblog海水パンツとゴーグルで、巨万の富を築きました。カリブの怪物、フリーアルバイター瞳です。結婚式2次会で当たりました。Moratoriumも終了が近づいてきました。3.1が出てから最低2年間は言語仕様やビルトインは変更しませんよ」というPEP。3.3からは再び更新あり。3への移行を考えていたらいくつか記事があったのでご紹介します。documentationGuido御大の超ざっくりな移行ガイド。3.0での変更事項について詳細に記述してあるので要参照。3.3の公式ドキュメントでは移行について詳細な記述が増えました。Bayer(zzzeek)のエントリを翻訳しました。3への移行方法のハウツーってネット見ても見つからないんだけど?」と聞いてきました。'10(か'09かたしかそのへん)でやったようなネタを書いたブログエントリが見つかるだろうと思ってGoogleで調べてみました。したら驚くことに、2to3ツールとGuidoのオリジナルガイド以外にはほとんど何もなかったんです。いうわけで、これからPyPIにあるSQLAlchemyとMakoのPy2kとPy3k両方に対応したリリース版を作るまでに行ったやり方をご紹介します。フラグ付きで実行してください。警告が1つもでないようにして下さい。somedict.has_key("hi"):thereここに出ているすべての警告を直します。2.3や2.4のような古いバージョンのPythonもサポートする必要がある場合には、実行系のバージョンやライブラリの検知するものを使わなければいけないでしょう。2.4にはcollections.Callableがありません。それ以外にもあります。フラグ付きでパスしたとしましょう。2.ライブラリ全体に2to3を実行して何が起きるかを見るこのステップはみんながよく知っている部分です。2to3ツールを実行して、特急券を手に入れましょう。-w2to3は何をしているかをすべてstdoutにダンプします。フラグはその場でファイルを上書きします。自分の場合は、ソースツリーをコピーして、オリジナルの代わりとなるPy2kのツリーとします。2.xのソースをコミットするツリーとして残るわけです。大きなアプリケーションやライブラリでは、いくつか、もしかするとほとんどが2to3の処理を経て無傷ではいられない、なんていうのはよくあることです。SQLAlchemyの場合は、普通の文字列型、Unicode型、Byte型の問題の他に、辞書型に対してiteritems()をitems()に、iteralues()をvalues()に名前を変更するところで問題がありました。--いくつかの独自の辞書型は壊れました。-3フラグで警告が一切無く、2to3ツールが動作しないコードを生成している場合、一般的に3つのアプローチでバージョン間互換性を達成することができます。以下、重要度の昇順で並べました。Py3kでは使えないイディオムをバージョン間互換になるようにする一番簡単なのは、対象のコードが修正可能なら、Py3k向けに2to3ツールを実行した後、どちらのプラットフォームでも動作するように修正することです。一般的に多くのBytes/Unicodeの問題が起きます。次のようなコードがあります:hexlify(somestring)...これはPy3kでは動作しません。hexlify()はBytesが必要なのです。これは次のように変更するのが適切でしょう:hexlify(somestring.encode('utf-8'))Makoでは、render()メソッドはエンコードされた文字列を返します。これはPy3kではBytesです。sys.platform.startswith('win')これは基本的には事前にフラグを取得して、異なるプラットフォームで固有の動作を選択できるようにしています。3.2で戻って来ますが)向けに、SQLAlchemyではcompat.pyモジュールで次ようなブロックがあります。プリプロセッサを使う"実行時フラグ"アプローチはおそらく90%くらいのPythonライブラリが行う必要があります。SQLAlchemyではより手荒な手段にでました。2to3ツールにプリプロセッサをくっつけたのです。この利点は互換性のない構文に対処できること、実行時の真偽値フラグによる遅延時間がどこか致命的になるのではないかという心配をしなくていいこと、そして個人的にはちょっと読みやすくなることです。クラス宣言では同じレベルのインデントを維持できます。プリプロセッサはSQLAlchemyの配布の一部で、ここからダウンロードできます。いまのところは動作させるのにモンキーパッチとしています。プリプロセッサの使い方はフォーラムや講演で話してきましたが、いまだに他の人がこういったアプローチをとっているという話を他に聞いたことがありません。この方法をどうしたら良く出来るか、提案は大歓迎です。モンキーパッチなしにこういったことができる、普通の2to3"修正器"を取得する方法がある(仕事には使えませんでした--例を一つ挙げるとシステムがコメントを読み込まないというのがあります)とか、あるいはプリプロセッサに近い利点がある他の方法とかなんでも結構です。例としてはIdentityMap辞書サブクラスがあります。Py2K"のコメントが取り上げられています。iter(self._get_items())新しい構文が便利だという時もこの方法を使います。Py2K2to3ツールはwith_traceback()の呼び出しに変更しています。2.6に対しても間違って行なってしまいます。(2.7で修正されました)fromキーワードは例外が"チェーン"に保存されるという点でwith_traceback()とは少々異なる意味を持っています。3対応しているコードは無視します。3アプリケーションに変換できましたので、このスクリプトを2to3ディレクティブを使ってsetup.pyスクリプトと統合しましょう。説明書きが望まれ、その場合distutilsがこのフラグを受け付けます。これはDistributeがインストールされている場合でないと正しく動作しません。Guideがガイドラインとして役に立つでしょう。3インタプリタのどちらかにインストールされます。3だった場合、ソースがインストールされる前に2to3が実行されます。3版としているのを見ました。私はこういう選択をするパッケージが減ることを心より願います。3版のリリースが遅くなる)、バグが増えること(単体テストが同じソースツリーに対して実行されるわけではないから)、そして最善の方法に思えないからです。2版を管理するおとになるのです。3で動作することを周知するもっとも主要な手段です。Regebroの本です。実際の移行が始まる前に確認しておきたいですね。こんにちは、Python界の情弱です。こんにちは、Python界の情弱です。こんにちは、Python界の情弱です。»プロフィールid:ymotongpooこのブログは山口の個人的なものです。ここで述べられていることは私の個人的な意見に基づくものであり、私の雇用者には一切の関係はありません。(1)検索はてなブログをはじめよう!ymotongpooさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。