Python 2.xをPython 3.xとできるだけ互換性のある方法で作成するにはどうすればよいですか?

タデック:

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)を自由に使えるとしましょう。

dstromberg:

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]

編集
0

コメントを追加

0

関連記事

分類Dev

Python 2.xをPython 3.xとできるだけ互換性のある方法で作成するにはどうすればよいですか?

分類Dev

unicode_literals を使用して Python 2 および 3 で互換性のある type() 動作を取得するにはどうすればよいですか?

分類Dev

Pythonでe ^(-t ^ 2)の積分をx = 0からx = 3までプロットするにはどうすればよいですか?

分類Dev

Python 3.xで2.xのような並べ替え動作を実現するにはどうすればよいですか?

分類Dev

Python 2.7 + 3と互換性のあるパッケージをクリーンアップして、Python 3.6のみと互換性を持たせるにはどうすればよいですか?

分類Dev

Pythonで2つの数字9と3を特別な数字として作成するにはどうすればよいですか?

分類Dev

Python 3 | 数字の最初の2桁が00であるかどうかを確認するにはどうすればよいですか?

分類Dev

Python3および2と互換性のあるものを作成する

分類Dev

Python 3.x用のpsycopg2をインストールするにはどうすればよいですか?

分類Dev

Python 3で2つの関数を一緒に追加するにはどうすればよいですか?

分類Dev

'\ x1a \ x2b \ x3c \ x4d'から '1a2b3c4d'のように、Pythonでバイトとその16進表現(バイトも)を変換する簡単な方法はありますか?

分類Dev

Python 3で2つのパスをリンクするにはどうすればよいですか?

分類Dev

Bitnamiwordpress-multisiteを使用してGCPVMをデプロイするときに、「テンプレートはPython3と互換性がありません」という警告を防ぐにはどうすればよいですか?

分類Dev

Python 3で、2次元のnumpy配列の2つのサブ配列を交換するにはどうすればよいですか?

分類Dev

辞書内の2Dリストの列にあるすべての要素を合計するにはどうすればよいですか?Python 3

分類Dev

Python 3.xで文字列の末尾から数字を削除するにはどうすればよいですか?

分類Dev

Windows 7でPython 2および3を実行するにはどうすればよいですか?

分類Dev

Windows 7でPython 2および3を実行するにはどうすればよいですか?

分類Dev

[Python 3.x]ごとに異なる出力で2D配列または複数の出力を同じ行(シェルまたはウィンドウ)に再印刷するにはどうすればよいですか?

分類Dev

Python 3.7で正規表現を使用して2つまたは3つのグループを作成するにはどうすればよいですか?

分類Dev

Python 2.xと一緒にPython 3.xでpipを使用する方法

分類Dev

新しいpythonプラグインを使用するときに、コードをpython3ではなくpython2として実行するようにsnapcraftに指示するにはどうすればよいですか?

分類Dev

python 2の代わりにpython3を使用するようにrmarkdownを指定するにはどうすればよいですか?

分類Dev

Pythonで2つのリストを互いに比較するにはどうすればよいですか?

分類Dev

SublimeTextでPython2からPython3に切り替えるにはどうすればよいですか

分類Dev

Python 3.xのinput()関数のNameErrorを修正するにはどうすればよいですか?

分類Dev

Python3.xの関数で辞書にインデックスを付けることができるようにするにはどうすればよいですか。

分類Dev

「python」コマンドをpython3ではなくpython2を指すように設定するにはどうすればよいですか?

分類Dev

スーパーバイザー構成をpython2からpython3に変換するにはどうすればよいですか?

Related 関連記事

  1. 1

    Python 2.xをPython 3.xとできるだけ互換性のある方法で作成するにはどうすればよいですか?

  2. 2

    unicode_literals を使用して Python 2 および 3 で互換性のある type() 動作を取得するにはどうすればよいですか?

  3. 3

    Pythonでe ^(-t ^ 2)の積分をx = 0からx = 3までプロットするにはどうすればよいですか?

  4. 4

    Python 3.xで2.xのような並べ替え動作を実現するにはどうすればよいですか?

  5. 5

    Python 2.7 + 3と互換性のあるパッケージをクリーンアップして、Python 3.6のみと互換性を持たせるにはどうすればよいですか?

  6. 6

    Pythonで2つの数字9と3を特別な数字として作成するにはどうすればよいですか?

  7. 7

    Python 3 | 数字の最初の2桁が00であるかどうかを確認するにはどうすればよいですか?

  8. 8

    Python3および2と互換性のあるものを作成する

  9. 9

    Python 3.x用のpsycopg2をインストールするにはどうすればよいですか?

  10. 10

    Python 3で2つの関数を一緒に追加するにはどうすればよいですか?

  11. 11

    '\ x1a \ x2b \ x3c \ x4d'から '1a2b3c4d'のように、Pythonでバイトとその16進表現(バイトも)を変換する簡単な方法はありますか?

  12. 12

    Python 3で2つのパスをリンクするにはどうすればよいですか?

  13. 13

    Bitnamiwordpress-multisiteを使用してGCPVMをデプロイするときに、「テンプレートはPython3と互換性がありません」という警告を防ぐにはどうすればよいですか?

  14. 14

    Python 3で、2次元のnumpy配列の2つのサブ配列を交換するにはどうすればよいですか?

  15. 15

    辞書内の2Dリストの列にあるすべての要素を合計するにはどうすればよいですか?Python 3

  16. 16

    Python 3.xで文字列の末尾から数字を削除するにはどうすればよいですか?

  17. 17

    Windows 7でPython 2および3を実行するにはどうすればよいですか?

  18. 18

    Windows 7でPython 2および3を実行するにはどうすればよいですか?

  19. 19

    [Python 3.x]ごとに異なる出力で2D配列または複数の出力を同じ行(シェルまたはウィンドウ)に再印刷するにはどうすればよいですか?

  20. 20

    Python 3.7で正規表現を使用して2つまたは3つのグループを作成するにはどうすればよいですか?

  21. 21

    Python 2.xと一緒にPython 3.xでpipを使用する方法

  22. 22

    新しいpythonプラグインを使用するときに、コードをpython3ではなくpython2として実行するようにsnapcraftに指示するにはどうすればよいですか?

  23. 23

    python 2の代わりにpython3を使用するようにrmarkdownを指定するにはどうすればよいですか?

  24. 24

    Pythonで2つのリストを互いに比較するにはどうすればよいですか?

  25. 25

    SublimeTextでPython2からPython3に切り替えるにはどうすればよいですか

  26. 26

    Python 3.xのinput()関数のNameErrorを修正するにはどうすればよいですか?

  27. 27

    Python3.xの関数で辞書にインデックスを付けることができるようにするにはどうすればよいですか。

  28. 28

    「python」コマンドをpython3ではなくpython2を指すように設定するにはどうすればよいですか?

  29. 29

    スーパーバイザー構成をpython2からpython3に変換するにはどうすればよいですか?

ホットタグ

アーカイブ