Python 3.xの機能をPython 2.xに含めるには多くの方法があるため、将来、Python 2.xスクリプトのコードを簡単にPython 3.xに変換できるようになります。これらの例の1つは、print
ステートメントをprint()
関数に置き換えることです。
>>> from __future__ import print_function
Python 2.xコードを可能な限りPython 3.xに近づける方法をいくつか教えてくれるリストやリソースはありますか?
Python 2.xの外観と動作をPython 3.xのようにすることができる他の有用なインポートまたは定義の例を挙げていただけますか?
最新のPython 2.x(現時点では2.7.2)を自由に使えるとしましょう。
CPython 2. [567]、CPython 3. [0123]で実行される約5000行の重複排除バックアッププログラム(http://stromberg.dnsalias.org/~strombrg/backshift/)を最後に仕上げています。(3.3はまだアルファ0です)、Pypy 1.7、Jythonトランク。私もIronPythonを試しましたが、それはかなり異なっていました-標準ライブラリがなかったので、バックシフトの愛はありませんでした。ああ、それは最も内側のループまたはpsycoにCythonを使用できますが、pypyは特に32ビットシステムではどちらよりも高速です。
とにかく、2.xと3.xで同じように実行されるコードを書くために必要なのは、
1)print(variable)は、2.xと3.xの両方で同じように機能します。print(variable1、variable2)は行いません。2.xでは、print(variable)は「この括弧で囲まれた式を評価し、printステートメントを使用して単一の結果を印刷します」と言います。3.xでは、print(variable)は「この単一の結果でprint関数を呼び出します。したがって、print( 'abc%d%d'%(1、2))は単一値の結果であるため、両方で正常に動作します。また、文字列の書式設定には%演算子を使用しました。
2)8進定数は避けてください。0755と書く代わりに、(7 * 64 + 5 * 8 + 5)と書いてください。
3)どちらでもバイナリI / Oを行うために、bufsockモジュールを使用しました。http://stromberg.dnsalias.org/~strombrg/bufsock.htmlファイルをos.openし、bufsockでラップします(またはモジュールでrawioクラスを使用します)。2.xでは、これは8ビット文字列としてエンコードされたバイトの文字列を返します。3.xでは、これはbytesオブジェクトを返します。これは小さな整数のリストのように機能します。次に、どちらか一方を渡し、必要に応じて「isinstance(foo、str)」でテストして、2つを区別します。バックアッププログラムにとってバイトはバイトなので、これを行いました。データを確実に保存するためにエンコーディングを汚したり、すべてのエンコーディングが適切に往復したりする必要はありませんでした。
4)例外を実行するときは、「as」キーワードを避けてください。代わりに、EGを使用します。
try:
self.update_timestamp()
except (OSError, IOError):
dummy, utime_extra, dummy = sys.exc_info()
if utime_extra.errno == errno.ENOENT:
5)2.xから3.xへの移行時に、多数のモジュールの名前が変更されました。それで、どちらかを空のモジュールにインポートしてみてください:
try:
from anydbm import *
except ImportError:
from dbm import *
...これはモジュール自体にEG adbm.pyという名前で表示されます。次に、キーと値のストアが必要なときはいつでも、2.xまたは3.xに直接必要な2つの異なるものの代わりにadbmをインポートします。次に、そのずんぐりしたモジュールadbm.py以外のすべてをPylintします。そして、このようなPylintが嫌いなもの。アイデアは、小さなモジュール内の「すべてのものを得なければならない」規則を除いて、モジュールごとに1つの例外を除いて、可能な限りすべてのものをPylintすることでした。
6)2.xと3.xで実行される自動単体テストとシステムテストをセットアップし、少なくとも1つの2.xインタープリターと少なくとも1つの3.xインタープリターで頻繁にテストすることは、多くの助けになります。また、2.5.xへの準拠をチェックしたpylintだけですが、コードに対してpylintを頻繁に実行します。pylintが3.xのサポートを受ける前にプロジェクトを開始しました。
7)いくつかの定数と呼び出し可能オブジェクトを含む小さな「python2x3」モジュールを設定して、人生を楽にしました:http ://stromberg.dnsalias.org/svn/python2x3/trunk/python2x3.py
8)b ''リテラルは、2.5では機能しませんが、2で機能します[67]。前処理や何かをしようとする代わりに、通常3.xではb ''リテラルである多くのものが含まれるconstants_mod.pyを設定し、それらを単純な文字列から2の「バイト」タイプが何であるかに変換しました.xまたは3.x。したがって、これらは実行時に何度も何度もモジュールのインポート時に変換されません。2をターゲットにしている場合。[67] 以上、もっと良い方法があるかもしれませんが、私が始めたとき、Pypyプロジェクトは2.5としか互換性がなく、Jythonはまだ互換性があります。
9)2.xでは、長整数にはLサフィックスが付いています。3.xでは、すべての整数が長いです。したがって、私はできるだけ長い整数定数をできるだけ使わないようにしました。2.xは必要に応じて整数をlongに昇格させるため、これはほとんどの場合うまく機能するようです。
10)多くのpythonインタープリターをテストするのに役立ちます。2. [567]をビルドしました および3. [0123] テストを簡単にするために、それらを/ usr / local / cpython-xy /に隠しておきました。また、テストを簡単にするために、PypyとJythonを/ usr / localに配置しました。CPythonビルドを自動化するスクリプトがあることは、かなり価値がありました。
これらは、重要なプロジェクトで移植性の高いpythonコードベースを取得するために必要なすべてのゆがみであると思います。上で書いたリストの大きな欠落の1つは、私がUnicodeオブジェクトを使用しようとしていないことです。これは、おそらく他の誰かがコメントするのに適したものです。
HTH
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加