python2とpython3の文法違い,変更
ほぼすべての Python 2 プログラムは,Python 3 の環境で正常に動作するためにいくつかの変更を必要とします.この変換プロセスを簡素化するために,Python 3 には2to3 と呼ばれる実用スクリプト ((Utility Script) が搭載されています.このスクリプトは,あなたの Python 2 プログラムのソースファイルをインプットとして,それを Python 3 の形式に自動的に変換します.
Python 2では,print は文である。あなたが出力したいものは何であれ,print キーワードの後ろにそれを置くだけで出力できます。Python 3では,print ((() は関数である。他の関数と同様に,print ((() は,あなたが出力したいものを,その関数として渡す必要があります。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | print() | |
| ② | print 1 | print(1) |
| ③ | print 1,2 | print(1,2) |
| ④ | print 1,2, | print(1,2,end=' ') |
| ⑤ | print >>sys.stderr,1,2,3 | print(1,2,3, file=sys.stderr) |
1、 空の行を出力するには,参数のない print を呼び出す必要がある ((() 。
2、 単一の値を出力するには, print ((() の1つの引数としてこの値を入力する必要があります。
3、出力には空白で区切られた2つの値を使用し,2つの参数でprint ((() を呼び出す.
この例にはいくつかのテクニックがあります。 Python 2では, print 文の末尾に comma ((,) を使えば,空白で出力結果を隔て,その後に続く空白 (((trailing space) を出力するので,carriage return を出力しない。 Python 3では,end=' 'をキーワードのパラメータとしてprint に渡すことで同じ効果を達成できます。 end 参数には '\n' のデフォルト値が設定されているので,end 参数値を再指定することで,末尾の出力車輪符を削除できます。
Python 3 では,パイプをキーワードパラメータファイルの値としてprint ((() に渡すことで同じ機能を果たすことができます.パラメータファイルのデフォルト値はstd.stdoutなので,その値を再指定するとprint ((() が別のパイプに輸出されます.
Python 2 には 2 つの文字列タイプがあります.Unicode文字列についてそして非Unicode文字列Python 3 のタイプは次のとおりです.Unicode文字列 (Unicode strings) について。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | u'PapayaWhip' | 'PapayaWhip' |
| ② | ur'PapayaWhip\foo' | r'PapayaWhip\foo' |
Python 2 の Unicode 文字列は, Python 3 の文字列は常に Unicode 形式であるため,Python 3 の普通文字列である.
Unicode原始文字列 ((raw string) ((この文字列を使用すると,Pythonは反斜線を自動的に変換しない"") は,Python 3 で,すべての原始文字列がUnicode でコードされているため,通常の文字列に置き換えられた.
Python 2 には,オブジェクトを文字列に強制的に変換する2つの全局関数があります:unicode ((() はオブジェクトをUnicode文字列に変換し,str ((() はオブジェクトを非Unicode文字列に変換します.Python 3 には,Unicode文字列の文字列タイプが1つしかありませんので,str ((() 関数はすべての機能を完了します.unicode ((() 関数は Python 3 ではもう存在しない。)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | unicode(anything) | str(anything) |
Python 2 には,浮点数以外の int と long タイプが用意されている。int タイプの最大値は sys.maxint を超えるべきではないし,この最大値はプラットフォームに関係している。数字の最後に L を付加することで,長整数型を定義できる.明らかに,int タイプが表す数字の範囲よりも大きい。Python 3 には,整数型の int が1つしか存在しないが,ほとんどの場合,Python 2 の長整数型と似ています。もう2種類の整数は存在していないので,それらを区別するために特別な文法を使用する必要はありません。
PEP 237:整形と整形を統一する
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 1000000000000L | x = 1000000000000 |
| ② | x = 0xFFFFFFFFFFFFL | x = 0xFFFFFFFFFFFF |
| ③ | long(x) | int(x) |
| ④ | type(x) is long | type(x) is int |
| ⑤ | isinstance(x,long) | isinstance(x,int) |
Python 2 の十進制の長整形は,Python 3 の十進制の普通整数に置き換えられた.
Python 2 の 16 桁の長整型は Python 3 の 16 桁の普通整数に置き換えられた.
Python 3 では,長整型がなくなってしまい,自然の long () 函数も存在しない. 変数を整型に強制的に変換するには,int () 函数を使用できます.。
変数が整型かどうかを確認し,そのデータ型を取得し,int型 ((not long) と比較する.
また,instance () 関数を用いてデータ型をチェックすることもできます.また,インスタンス () 関数を用いて整数型をチェックすることもできます.
Python 2 は<> を!= の同義語としてサポートする.Python 3 は!= をのみサポートし,もはや<> をサポートしていない.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | if x <> y: | if x != y: |
| ② | if x <> y<> z: | if x != y!= z: |
比較するだけでいい
2. 比較的複雑な3つの値間の比較
Python 2では,辞書オブジェクトのhasは_キー () メソッドは,辞書に特定のキー () が含まれているかどうかをテストするために使われます. Python 3 はこのメソッドをサポートしていません.inオペレーター
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.has_key('PapayaWhip') | 'PapayaWhip' in a_dictionary |
| ② | a_dictionary.has_key(x) or a_dictionary.has_key(y) | x in a_dictionary or y in a_dictionary |
| ③ | a_dictionary.has_key(x or y) | (x or y) in a_dictionary |
| ④ | a_dictionary.has_key(x + y) | (x + y) in a_dictionary |
| ⑤ | x + a_dictionary.has_key(y) | x + (y in a_dictionary) |
1 シンプルな形式
2、 オペレーターorの優先度は, オペレーターinより低いので,ここには括弧を加える必要はありません.
3 反対に,同じ理由で, or の優先度が in よりも低いので,ここには括弧を追加する必要があります。(注意:ここでのコードは,前の行とは全く異なる。Python は最初に x or y を解釈して,結果 x ((x がブル上の文脈で真である場合) または y を得ます。そして,Python は,この結果が a か否かをチェックします._dictionaryのキーの一つ。)
4 演算子 in の優先度は演算子 + より低いので,この形式のコードは技術的に括弧を必要としないが,2to3 が追加されている.
5. この形式は,inの優先度が+。より低いため,括弧が必要である.
Python 2では,多くの辞書型のメソッドの返される値はリストである。最もよく使われるメソッドには,キー,アイテム,および値がある。Python 3では,上記のすべてのメソッドの返される値は,ダイナミックビューに変更されている。いくつかの文脈環境では,この変更は影響を与えない。これらのメソッドの返される値は,別の関数に即座に転送され,その関数が,全序列を横切るならば,上記のメソッドの返される値はリストまたはビューであり,何の違いも生じない。他の場合,Python 3ではこれらの変更は重要である。もし,個別に検索可能な要素のリストを期待するならば,Python 3ではこれらの変更は,インデックスをサポートしないため,あなたのコードカードを閉じます。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_dictionary.keys() | list(a_dictionary.keys()) |
| ② | a_dictionary.items() | list(a_dictionary.items()) |
| ③ | a_dictionary.iterkeys() | iter(a_dictionary.keys()) |
| ④ | [i for iin a_dictionary.iterkeys()] | [i for iin a_dictionary.keys()] |
| ⑤ | min(a_dictionary.keys()) | no change |
- list () 関数が keys () の返り値を静的なリストに変換するので,セキュリティ上の考慮のために,2to3 はエラーを報告する可能性があります.このようなコードは有効ですが,ビューを使用する場合は効率が低いです.リストが必要かどうかを確認するために,変換したコードをチェックし,ビューも同じように動作するかもしれません.
これは別の View ((items (() 方法の) をリストに変換するものです。2to3対values (() 方法の返り値の変換も同様です。 - Python 3 では,iterkeys ((() がサポートされなくなりました. 必要に応じて,iter ((() を使って,keys ((() の返される値を代入器に変換します.
4,2to3は,iterkeys () メソッドがリスト解析で使用されていることを認識し,それをPython 3のkeys () メソッドに変換します.
5・2to3は,keys ((() の返される値がすぐに他の関数に伝わることを認識し,その関数は,その列の全体を通過するので,keys ((() の返される値をリストに変換する必要はありません.その反対に,min ((()) 関数は,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関数で,その関
Python 2からPython 3まで,標準クエリのいくつかのモジュールは改名されている.また,相互に関連したモジュールは,結合または再編成され,関連性がより論理的になる.
- http
Python 3 では,いくつかの関連した HTTP モジュールが単一のパッケージ,http。に組み込まれています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import httplib | import http.client |
| ② | import Cookie | import http.cookies |
| ③ | import cookielib | import http.cookiejar |
| ④ | import BaseHTTPServer <br> import SimpleHTTPServer <br> import CGIHttpServer | import http.server |
http.clientモジュールは,HTTPリソースをリクエストし,HTTP応答を解析するために使用できる底層のライブラリを実装しています.
http.cookiesモジュールは,HTTPヘッダー (HTTP header) でSet-Cookieから送信されたクッキーを取得するための,ピソニックなインターフェースを提供します.
一般的なブラウザでは,クッキーはファイルとしてディスクに保存され,http.cookiejarモジュールでこれらのファイルが操作できます.
http.serverモジュールは,基本的なHTTPサーバを実装する
- urllib
Python 2 には URL を分析,コード,取得するためのモジュールがいくつかありますが,これらのモジュールはマウス<unk>のように互いに重複しています.Python 3 では,これらのモジュールが再構成され,別個のパッケージ,urllibに組み込まれています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib | import urllib.request <br> urllib.parse,urllib.error |
| ② | import urllib2 | import urllib.request <br> urllib.error |
| ③ | import urlparse | import urllib.parse |
| ④ | import robotparser | import urllib.robotparser |
| ⑤ | from urllib import FancyURLopener <br> from urllib import urlencode | from urllib.request import FancyURLopener <br> from urllib.parse import urlencode |
| ⑥ | from urllib2 import Request <br> from urllib2 import HTTPError | from urllib.request import Request <br> from urllib.error import HTTPError |
以前,Python 2 の urllib モジュールには,urlopen () を含む様々な関数があり,URL をその構成要素であるsplittype () ,splithost () とsplituser () に分割するのに役立ちます.新しいurllibパッケージでは,これらの関数はより論理的に組織されています. 2to3 は,これらの関数の呼び出しを新しい命名プログラムに適合するように変更します.
Python 3 では,以前の urllib2 モジュールが urllib パッケージに組み込まれています. また,urllib2 でお気に入りのものが Python 3 の urllib モジュールに常に登場します. 例えば,build_opener () メソッド,Request オブジェクト,HTTPBasicAuthHandler,そしてfriends。
Python 3 の urllib.parse モジュールには,オリジナルの Python 2 の urlparse モジュールのすべての解析関数が含まれている。
urllib.robotparse モジュールは,robots.txt ファイルを解析する。
HTTP リダイレクトやその他のステータスコードを処理する FancyURLopener クラスは,Python 3 の urllib.request モジュールで有効である。urlencode ((() 関数は,urllib.parse に移行されている。
Request オブジェクトは,urllib.request に有効のままですが,HTTPError のような常数は,urllib.error に転送されています.
2to3は,あなたの関数呼び出しを書き換えるということも言及しましたか? 例えば,もしあなたの Python 2 のコードに urllib モジュールがインポートされ,urllib.urlopen ((() という関数でデータを取得すると,2to3は,import 文と関数呼び出しを同時に修正します.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import urllib print urllib.urlopen('http://diveintopython3.org/').read() | import urllib.request, urllib.parse, urllib.error <br> print(urllib.request.urlopen('http://diveintopython3.org/').read()) |
- dbm
すべてのDBMクローンは,現在,dbmという単一のパッケージに含まれています.特定の変種,例えばGNUDBMが必要であれば,dbmパッケージに適切なモジュールをインポートできます.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import dbm | import dbm.ndbm |
| ② | import gdbm | import dbm.gnu |
| ③ | import dbhash | import dbm.bsd |
| ④ | import dumbdbm | import dbm.dumb |
| ⑤ | import anydbm <br> import whichdb | import dbm |
- xmlrpc
XML-RPCは,HTTPプロトコル経由でリモートRPC呼び出しを実行する軽量級の方法である.いくつかのXML-RPCクライアントとXML-RPCサーバ端の実装ライブラリは,現在,xmlrpcという独立したパッケージに統合されている.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import xmlrpclib | import xmlrpc.client |
| ② | import DocXMLRPCServer <br> import SimpleXMLRPCServer | import xmlrpc.server |
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import cStringIO as StringIO <br>except ImportError: <br> import StringIO | import io |
| ② | try:<br> import cPickle as pickle <br>except ImportError: <br> import pickle | import pickle |
| ③ | import _builtin_ | import builtins |
| ④ | import copy_reg | import copyreg |
| ⑤ | import Queue | import queue |
| ⑥ | import SocketServer | import socketserver |
| ⑦ | import ConfigParser | import configparser |
| ⑧ | import repr | import reprlib |
| ⑨ | import commands | import subprocess |
- Python 2では,通常,StringIOの代替としてcStringIOをインポートしようとします.失敗すると,StringIOをインポートします. Python 3では,これをしないでください.ioモジュールは,この問題を処理します.
Python 3 では,pickle モジュールが自動的に処理しますので,これ以上はしないでください. - builtins モジュールには,Python 言語全体で使われるグローバル関数,クラス,定数が含まれています. builtins モジュール内の特定の関数を再定義することは,このグローバル関数をあらゆるところで再定義することを意味します. 強力に聞こえますが,同時に恐ろしいものです.
- copyreg モジュールは,C言語で定義されたユーザーカスタムタイプに,pickle モジュールのサポートを追加した.
- queue モジュールは,生産者・消費者のキューを実現する.
- socketserverモジュールは,様々なソケットサーバを実装するための一般的な基礎クラスを提供する.
7 設定パーサーモジュールでINI-styleの設定ファイルを解析する. - reprlib モジュールでは,内置関数repr (()) を再実装し,文字列が切断される前に表示される長さの制御を追加した.
- subprocess モジュールは,子プロセスを作成し,それらのパイプに接続し,それらの返却値を取得することができます.
- パッケージ内の相対インポート
パッケージは,関連するモジュールのグループから構成された単一の実体である.Python 2では,同じパッケージ内のモジュールの相互参照を実現するために,import fooまたはfrom foo import Barを使用する.Python 2のインタプリタは,まず,現在のディレクトリでfoo.pyを検索し,次にPythonの検索パス ((sys.path) で検索する.Python 3では,このプロセスは少し異なります.Python 3では,まず現在のパスで検索せず,直接Pythonの検索パスで検索します.
複数のファイルが同じディレクトリに収められている場合:
chardet/
|
+--init.py
|
+--constants.py
|
+--mbcharsetprober.py
|
+--universaldetector.py
では,universaldetector.py が constants.py をすべて輸入し,mbcharsetprober.py のクラスも輸入する必要があると仮定してみましょう.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | import constants | from .import constants |
| ② | from mbcharsetprober import MultiByteCharSetProber | from .mbcharsetprober import MultiByteCharsetProber |
- パッケージの他の部分からモジュール全体をインポートする必要がある場合,新しいfrom . import シンタジーを使用する。ここでの文号 (((.) は,現在のファイル ((universaldetector.py)) とあなたがインポートしたいファイル ((constants.py)) の間の相対的なパスを表している。この例では,この2つのファイルは同じディレクトリにあるため,単一の文号を使用しています。あなたはまた,親ディレクトリ (((from .. import anothermodule) または子ディレクトリからインポートすることもできます。
- 特定のクラスまたは関数を他のモジュールから直接あなたのモジュール名空間にインポートするには,インポートが必要なモジュール名に相対パスを加え,最後の斜線を削除します. この例では,mbcharsetprober.pyとuniversaldetector.pyは同じディレクトリにあり,相対パスの名前は文号です. あなたはまた,親ディレクトリから (from .. import anothermodule) または子ディレクトリからインポートすることができます.
Python 2では,<unk>代はnext (()) の方法を持ち,その配列の次の項を返します。Python 3でも同じことが成立しますが,今や新しい全局的な関数next (()) があり,それは<unk>代をパラメータとして使用します。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | anIterator.next() | next(anIterator) |
| ② | a_function_that_returns_an_iterator().next() | next(a_function_that_returns_an_iterator()) |
| ③ | class A:<br> def next(self):<br> pass | class A:<br> def next(self):<br> pass| |
| ④ | class A:<br> def next(self, x, y):<br> pass | no change |
| ⑤ | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() | next = 42<br>for an_iterator in a_sequence_of_iterators:<br> an_iterator.next() |
- 最も簡単な例では,代数のnext () メソッドを呼び出すのをやめて,その代数の自己をグローバル関数next () にパラメータとして渡します.
- もし返される値がイデュレータの関数である場合,この関数を呼び出して,その結果を next () 関数にパラメータとして渡します。。 2to3 スクリプトは,この変換を正しく実行できるほど知的なものです。)
Python 3 では,特殊な方法の定義で, クラスを定義し,それを代数として使うことができます.__next_実現するために. - もし,定義したクラスにnext () があれば,そのクラスには1つまたは複数のパラメータが使用され,2〜3の実行時に動かない.このクラスは,next () メソッドにパラメータがあるので,代数として使用できません.
5 これは少し複雑です. もし,next というローカル変数がある場合,Python 3 では,その変数の優先順位は,next というグローバル関数より高くなります.next() 序列の次の要素を取得する。( または,このローカル変数の名前をnextとしないようにコードを再構成することもできますが,2to3はこれをしません。)
Python 2では,filter() メソッドは,列の各項を検出する TrueまたはFalse の関数で得られたリストを返します.Python 3では,filter() 関数は,リストではなく,代数返します.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | filter(a_function, a_sequence) | list(filter(a_function, a_sequence)) |
| ② | list(filter(a_function, a_sequence)) | no change |
| ③ | filter(None, a_sequence) | [i for iin a_sequence if i] |
| ④ | for i in filter(None, a_sequence): | no change |
| ⑤ | [i for iin filter(a_function, a_sequence)] | no change |
1,最も単純な場合, 2to3は,list () 関数でfilter () を包装し,list () 関数は,そのパラメータを巡って,リスト () を返します.
しかし,filter() の呼び出しが list() パッケージに包まれていれば,2to3は処理を繰り返さない.この場合,filter() の返される値が代数であるかどうかは関係ありません.
3 フィルター ((None, ...) の特殊な文法に対応するために,2to3は,この呼び出しを文法的に等価なものからリスト解析に変換する.
4. for ループは,このシークエンス全体を回るので,これ以上修正する必要はありません.
5. 上記と同じで,リスト解析が全序列を巡るため,修正する必要はありません. filter ((() が 1 つの代数を返しても,以前の filter ((() がリストを返したように正常に動作します.
filter() の変更と同じく,map() 関数は,現在,イベリータを返します。(Python 2では,リストを返します。)
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | map(a_function,'PapayaWhip') | list(map(a_function,'PapayaWhip')) |
| ② | map(None,'PapayaWhip') | list('PapayaWhip') |
| ③ | map(lambda x: x+1,range(42)) | [x+1for x in range(42)] |
| ④ | for i in map(a_function, a_sequence): | no change |
| ⑤ | [i for iin map(a_function,a_sequence)] | no change |
1、 フィルター () の処理に類似して,最も単純な場合, 2to3 は list () 関数を使用してmap () を呼び出す.
2 特殊なmap ((None, ...) 構文については,filter ((None, ...) と似たように,2to3はこれをlist (()) を用いた等価呼び出しに変換する
3、map() の最初の参数がlambda関数である場合,2to3はこれを等価にリスト解析に変換する。
4. 序列全体を回る for ループは変更する必要はありません.
5 再び,リスト解析は全序列を回るので,ここでは変更する必要はありません. map () の返される値はリストではなく代入器であるとしても,正しく動作します.
Python 3では,reduce () 関数はグローバル名字空間から削除され,fucntools モジュールに配置されています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | reduce(a, b, c) | from functools import reduce reduce(a, b, c) |
Python 2 には,apply () というグローバル関数があり,関数fとリストを使用します.[a,b,c]を引数として,返される値はf ((a,b,c) である.この関数を直接呼び出すことで,リストの前に星号を追加することもできます.*) をパラメータとして渡して同じことをする. Python 3 では,apply ((() 関数はもはや存在しない. 星号記法を使用しなければならない.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | apply(a_function, a_list_of_args) | a_function(*a_list_of_args) |
| ② | apply(a_function, a_list_of_args, a_dictionary_of_named_args) | a_function(*a_list_of_args,**a_dictionary_of_named_args) |
| ③ | apply(a_function, a_list_of_args+ z) | a_function(*a_list_of_args+ z) |
| ④ | apply(aModule.a_function, a_list_of_args) | aModule.a_function(*a_list_of_args) |
参数列の () のようなもの.[a,b,c]と同じ) の前に星号を追加して函数を呼びます。これは,Python 2のapply ((() 函数と同等です。
Python 2 では,apply () 関数は実際に 3 つの参数を持つことができます. 函数,参数リスト,名付けられた引数の辞書. Python 3 では,参数リストの前に星号を追加して () を追加できます.),辞書名付けのパラメータの前に2つの星号を追加する ((**記事の内容はこうです
3 演算子+は,ここに接続リストの機能として使用され,演算子よりも優先順位があります., a_list_of_args + z の周りに余分な括弧を加える必要はありません.
4,2to3スクリプトは,インポートモジュール内の関数を含む複雑なapply () 呼び出しを変換するのに十分な知性を持っています.
Python 2では,intern (()) 関数の作用を,性能最適化のために,文字列に限定して ((intern)) することができます.Python 3では,intern ((() 関数は,sysモジュールに転送されています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | intern(aString) | sys.intern(aString) |
-
exec 文について
print 文がPython 3 で関数になるように,exec 文も同じです。exec() 関数は任意の Python コードを含む文字列をパラメータとして使用し,それを文または式を実行するように実行します。exec() はeval() に似ていますが,exec() はより強力で,より技巧的です。eval() 関数は単一の式しか実行できませんが,exec() は複数の文を実行し,インポート,インポート,関数宣言を行うことができます.
| Notes | Python 2 | Python 3 |
|---|
|①|exec codeString|exec(codeString)
|②|exec codeString in a_global_namespace|exec(codeString, a_global_namespace)|
|③|exec codeString in a_global_namespace, a_local_namespace|exec(codeString, a_global_namespace,a_local_namespace)|
1,最も単純な形式では,exec ((() が文ではなく,関数であるため,2to3は,この文字列形式のコードを括弧で囲みます。
2. Python 2 の exec 文は名前空間を指定し,コードはグローバルオブジェクトで構成されたこのプライベートスペースで実行されます.Python 3 もそのような機能があります.あなたはこの名前空間を第二のパラメータとしてexec () 関数に渡すだけです.
3. さらに不思議なことに,Python 2 の exec 文は,関数の中で宣言された変数 ((のような) ローカルネームスペースを指定することもできます.Python 3 では,exec (()) 関数にもこのような機能があります.
前の exec 文のように,Python 2 の execfile 文は Python コードを実行するように文字列を使用できます。 exec は文字列を使用していますが,execfile はファイルを使用しています。 Python 3 では,execfile 文は削除されています。 もし本当にファイル内の Python コードを実行したいのですが,それをインポートしたくない場合は,このファイルを開き,その内容を読み込み,それから compile () グローバル関数で Python インタプリタを強制的にコンパイルして,新しい exec () 関数を呼び出すことができます。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | execfile('a_filename') | exec(compile(open('a_filename').read(),'a_filename','exec')) |
Python 2では,任意のオブジェクトの文字列表示を,反引数で包む方法があります (例えば,x) の特殊な文法。 Python 3 では,この能力は残っているが,反引数でこのような文字列を得ることはできなくなっている。 グローバル関数repr ((() を使う必要がある。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | `x` | repr(x) |
| ② | `'PapayaWhip' + `2`` | repr('PapayaWhip'+ repr(2)) |
1 覚えておいてください,xはどんなものでもあり得ます. クラス,関数,モジュール,基本データ型などです.
Python 2では,反引数は組み込まれており,この不解な (しかし有効な) 表現である。2to3は,この組み込み呼び出しをrepr ()) 機能に変換するほど知的なものです。
Python 2 から Python 3 への移行では,異常を捕捉する文法が少し変わった.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | try:<br> import mymodule<br>except ImportError, e<br> pass | try:<br> import mymodule<br>except ImportError as e:<br> pass |
| ② | try:<br> import mymodule<br>except (RuntimeError, ImportError), e<br> pass | try:<br> import mymodule<br>except (RuntimeError, ImportError) as e:<br> pass |
| ③ | try:<br> import mymodule<br>except ImportError:<br> pass | no change |
| ④ | try:<br> import mymodule<br>except:<br> pass | no change |
Python 3 は,Python 2 の例外型の後にコマを追加する新しいキーワード,as。を使用しています.
2 キーワードasは,複数のタイプの異常を同時に捕獲した場合にも使用できます.
3 異例を捕まえて,異例のオブジェクト自体にアクセスしようとしない場合,Python 2とPython 3の文法は同じです.
4 類似して,もしすべての例外を捕捉するために保安方法 ((fallback) を使えば,Python 2 と Python 3 の文法も同じである.
5. モジュールをインポートする際 (あるいは他のほとんどの場合) は,この方法を使うべきではありません (上記のfallbackを参照). そうでなければ,プログラムがKeyboardInterrupt (ユーザがCtrl-Cでプログラムを中断した場合) のような異例を捕捉し,デビューをさらに困難にする可能性があります.
Python 3では,カスタム例外の文法に微妙な変更があります.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raise MyException | unchanged |
| ② | raise MyException,'error message' | raise MyException('error message') |
| ③ | raise MyException,'error message', a_traceback | raise MyException('errormessage').with_traceback(a_traceback) |
| ④ | raise 'error message' | unsupported |
- ユーザが設定したエラーメッセージのない例外を投影し,この最も単純な形式では,文法が変更されません.
Python 2 では,例外とエラーをコマで区切ります. Python 3 では,エラーをパラメータとして例外に転送します.
Python 2 では,より複雑な文法で,ユーザが設定した stack trace の例外を投げ出すことができます.Python 3 では,これを行うことができますが,文法が全く違います.
Python 3 では,この形式はもはやサポートされていません. 2to3 は,この文法を自動的に修正できないと警告します.
Python 2では,生成器にはthrow () メソッドがあります。a_generator.throw () を呼び出すと,生成器が停止されたときに例外を投げ,生成器関数から取得した次の値を返します。Python 3では,この機能はまだ使用できますが,文法的には少し異なります。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_generator.throw(MyException) | no change |
| ② | a_generator.throw(MyException,'error message') | a_generator.throw(MyException('error message')) |
| ③ | a_generator.throw('error message') | unsupported |
- シンプルな形式では,ユーザがカスタマイズしたエラーメッセージのない例外をジェネレータが投げる.この場合,Python 2からPython 3に文法的に変更はありません.
- ユーザが設定したエラーメッセージの例外が生成元に投げ出されれば,そのエラーメッセージの文字列 (エラー ストリング) を例外クラスに転送して,それをインスタンス化する必要があります.
Python 2 は,例外のみの例外を投げ出すことをサポートしています. Python 3 は,この文法をサポートしていません. 2to3 は,このコードを手動で修正する必要があることを警告する警告メッセージを表示します.
Python 2では,特定の範囲内の数字を得るための2つの方法があります. リストを返す range () と, 代数を返す range () があります. Python 3では,range () が代数を返し,xrange () は存在しません.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | xrange(10) | range(10) |
| ② | a_list = range(10) | a_list = list(range(10)) |
| ③ | [i for iin xrange(10)] | [i for iin range(10)] |
| ④ | for i in range(10): | no change |
| ⑤ | sum(range(10)) | no change |
1 簡単な場合, 2 to 3 は単に xrange を range に変換します.
2 ならば,あなたの Python 2 コードが range () を使用している場合, 2to3 はあなたがリストが必要かどうか,あるいは,エデュレータも行っているかどうかを知らない. 慎重のために, 2to3 はエラーを報告し,list () を使って range () の返される値をリスト型に強制的に変換する.
3. リスト解析に xrange () 函数がある場合,リスト解析は<unk>代器にも同様に有効であるため,返される値をリストに変換する必要はありません.
4 類似して,for ループは<unk>代器にも作用するので,ここでも何も変化しません.
5 ,関数sum ((() は代入器に作用するので,2to3もここで変更をしていない。 値がview ((view) として返され,リストではなく辞書クラスの方法のように,これはmin (((),max (((),sum (((),list (((),tuple (((),set (((),sorted (((),any (((),all ((() にも適用する.
Python 2 には,コマンドラインでユーザの入力を求める2つの全局関数があります. 一つは,input () と呼ばれ,ユーザが Python 式 () を入力して返信するのを待っています. 二つ目は,raw_input () と呼ばれ,ユーザが入力したものが返信されます.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | raw_input() | input() |
| ② | raw_input('prompt') | input('prompt') |
| ③ | input() | eval(input()) |
1",raw_input ()) "は"input ()) "と置き換えられている.
2. Python 2では,raw_input ((() 関数は,提示符をパラメータとして指定できます。Python 3ではこの機能は保留されています。
3. もし本当にユーザに Python エクスプレッションを入力して,結果を計算したいなら,input ((() 関数を呼び出し,返される値をeval ((() に渡すことができます.
Python 2では,関数の内部のコードは,関数の特殊属性にアクセスできます.Python 3では,一致性のために,これらの特殊属性は改名されています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | a_function.func_name | a_function._name_ |
| ② | a_function.func_doc | a_function._doc_ |
| ③ | a_function.func_defaults | a_function._defaults_ |
| ④ | a_function.func_dict | a_function._dict_ |
| ⑤ | a_function.func_closure | a_function._closure_ |
| ⑥ | a_function.func_globals | a_function._globals_ |
| ⑦ | a_function.func_code | a_function._code_ |
1、__name__属性 ((原func_name) は,関数の名前を含んでいる。
2、doc 属性 ((原funcdoc) は,あなたが関数ソースコードで定義したドキュメント文字列 ((docstring) を含みます)
3、__defaults__属性 ((原func_defaults) は,パラメータのデフォルト値を保存する元群である.
4、__dict__属性 ((原func_dict) は,任意の関数属性をサポートする名空間である。
5、__closure__属性 ((原func_closure) は,関数の自由変数 ((free variable)) に関する拘束を含む,セルオブジェクトで構成される元群である.
6、__globals__属性 ((原func_globals) は,モジュール全域名空間の参照であり,関数自体はこの名空間に定義されている。
7、__code__属性 ((原func_code) は,コンパイルされた関数体を表示するコードオブジェクトである.
Python 2では,ファイルオブジェクトにはxreadlines () メソッドがあり,これは 1 回で 1 行のファイルを読み取る代数を返します. これはforループでは特に有用です. 実際,Python 2の後のバージョンでは,ファイルオブジェクト自体にこのような機能が追加されています.
Python 3では,xreadlines ()) 方法は利用できなくなりました。2to3は簡単な状況では解決できますが,いくつかのエッジケースでは人工介入が必要になります。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | for line in a_file.xreadlines(): | for line in a_file: |
| ② | for line in a_file.xreadlines(5): | no change (broken) |
1 ならば,以前,xreadlines () を呼び出した場合, 2to3 はそれをファイルオブジェクトに変換します. Python 3 では,この変換後のコードは,以前と同じことを行うことができます. ファイルの一行を読み, for ループのループ体を実行します.
2 前にxreadlines () を呼び出すために ((毎回読み取る行数) を使っていた場合,2to3はPython 2からPython 3への変換を完了できず,コードは次のように失敗します. AttributeError: '_io.TextIOWrapper' object has no attribute 'xreadlines'。 Python 3 でコードが動作するように,xreadlines を readlines に手動で変換できます。 readline 方法は Python 3 で代数を返しますので,Python 2 のxreadlines との効率は相違ありません。
Python 2 では,匿名 lambda 関数を定義し,その関数には,その要素数を要素として指定することで,実際に複数のパラメータを受け付けることができます. 実際,Python 2 のインタプリタは,このパラメータを,名前付きのパラメータに解き放ち,それからそれを lambda 関数で引用できます.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | lambda (x,): x+ f(x) | lambda x1: x1[0]+f(x1[0]) |
| ② | lambda (x, y): x+f(y) | lambda x_y: x_y[0]+f(x_y[1]) |
| ③ | lambda (x,(y,z)): x+ y+ z | lambda x_y_z: x_y_z[0]+x_y_z[1][0]+ x_y_z[1][1] |
| ④ | lambda x, y, z: x+y + z | unchanged |
1 では,lambda関数を定義し,その関数として 1 つの要素を含む要素の元組を用いると,Python 3 では,その関数は x1 の要素を含む要素に変換されます.[0] に引用された lambda 関数。x1 は,元の元組の命名参数に基づいて2to3スクリプトで自動的に生成された。
2 , 2 つの要素を含む元組 ((x, y) をパラメータとして使用する lambda 関数は,x_y に変換され,x_y という2つの位置パラメータを持つ[x_yとx_yの両辺に等しくなります.[1]。
3,2to3スクリプトは,仮名パラメータをパラメータとして使用した元組をlambda関数として処理することもできます.生成された結果のコードは読みづらいですが,Python 3では,元のコードがPython 2では同じ効果を発揮します.
4. 複数のパラメータを使用するlambda関数を定義できます. プラグインがパラメータに囲まれていない場合,Python 2はそれを複数のパラメータを含むlambda関数として扱います. このlambda関数体では,他のタイプの関数と同様に,これらのパラメータを名前で参照します. この文法はPython 3でも有効です.
Python 2では,クラスメソッドは,そのクラスオブジェクト (class object) を定義する方法オブジェクト (method object) 自身にアクセスできます。im_selfはクラスのインスタンスオブジェクトであり,im_funcは関数オブジェクトであり,im_classはクラス自身である。Python 3では,これらの属性は,他の属性の命名コンベンションに従うように,改名されています。
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | aClassInstance.aClassMethod.im_func | aClassInstance.aClassMethod._func_ |
| ② | aClassInstance.aClassMethod.im_self | aClassInstance.aClassMethod._self_ |
| ③ | aClassInstance.aClassMethod.im_class | aClassInstance.aClassMethod._self_._class_ |
Python 2では,自分のクラスを作成し,ブル上の文脈 (boolean context) で使用できるようにします. 例えば,このクラスをインスタンス化して,このインスタンスオブジェクトをif文で使います.nonzero() メソッドは,TrueまたはFalseを返します. このメソッドは,インスタンスオブジェクトがブル上の文脈にあるときに呼び出されます. Python 3では,同じ機能を実行できます. しかし,この特殊なメソッドの名前は,bool()。
| Notes | Python 2 | Python 3 |
|---|
|①|class A:<br> def nonzero(self):<br> pass|class A:<br> def bool(self):<br> pass
|②|class A:<br> def nonzero(self, x, y):<br> pass|no change|
1 ブル上の文脈でクラスオブジェクトを使用すると,Python 3 が呼び出す__bool_違うのは__nonzero__()。
2 つのパラメータを使用します.__nonzero_方法 2 to 3 スクリプトは,あなたが定義したこの方法が他の用途があると仮定し,コードを修正しません.
Python 2とPython 3の間では,八進制 ((octal) 数を定義する文法にわずかな変更があった.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x = 0755 | x = 0o755 |
長整型と整型が統合されたため,sys.maxintの常数はもはや正確ではない。しかし,この値は特定のプラットフォームの能力を検出するのに有用であるため,Python 3で保持され,sys.maxsize。と改名された.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | from sys importmaxint | from sys importmaxsize |
| ② | a_function(sys.maxint) | a_function(sys.maxsize) |
1 maxint は maxsize になりました
2 すべてのsys.maxintはsys.maxsizeになる。
Python 2では,callable () というグローバル関数を使って,あるオブジェクトが呼び出されるかどうかを確認できます.Python 3では,このグローバル関数は削除されています.オブジェクトが呼び出されるかどうかを確認するには,特殊な方法を使用できます.__call_存在性について
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | callable(anything) | hasattr(anything,'_call_') |
Python 2では,全局関数zip() は任意の複数の配列をパラメータとして使用することができ,元組からなるリストを返します.最初の元組は,各配列の第1の要素を含みます.第二の元組は,各配列の第2の要素を含みます.順番に推移します.Python 3では,zip() はリストではなく,代数返します.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | zip(a, b, c) | list(zip(a, b, c)) |
| ② | d.join(zip(a, b, c)) | no change |
最も単純な形式では,list () 関数でzip () の返される値を呼び出すことで,zip () の前の機能を復元できます.list () 関数は,zip () 関数で返されるイデュレータを巡って,返される結果のリストを表します.
序列の全ての要素を巡る文脈環境では (join () メソッドの呼び出しのように),zip () が返されるエデュレータは正常に動作する。2to3スクリプトはこれらの状況を検出し,あなたのコードに変更はしません。
Python 2では,StandardErrorはStopIteration,GeneratorExit,KeyboardInterrupt,SystemExit以外のすべての内蔵例外の基層である.Python 3では,StandardErrorは削除され,Exceptionで置き換えられている.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | x =StandardError() | x =Exception() |
| ② | x =StandardError(a, b, c) | x =Exception(a, b, c) |
types モジュールには,オブジェクトのタイプを決定するのに役立つ様々な常数があります. Python 2では,dictやintのようなすべての基本的なデータタイプを代表する常数が含まれています. Python 3では,これらの常数は既に削除されています. 基本型の名前を使うだけで置き換えることができます.
| Notes | Python 2 | Python 3 |
|---|---|---|
| types.UnicodeType | str | |
| types.StringType | bytes | |
| types.DictType | dict | |
| types.IntType | int | |
| types.LongType | int | |
| types.ListType | list | |
| types.NoneType | type(None) | |
| types.BooleanType | bool | |
| types.BufferType | memoryview | |
| types.ClassType | type | |
| types.ComplexType | complex | |
| types.EllipsisType | type(Ellipsis) | |
| types.FloatType | float | |
| types.ObjectType | object | |
| types.NotImplementedType | type(NotImplemented) | |
| types.SliceType | slice | |
| types.TupleType | tuple | |
| types.TypeType | type | |
| types.XRangeType | range |
types.StringTypeは,Python 2の<unk>string<unk> (非Unicodeコードの文字列,つまり普通の文字列) は,実際には,ある種の文字コードを使用したバイトの配列 (a sequence of bytes) であるため,stringTypeは,stringsではなくバイトに映し出されます.
isinstance () 関数は,あるオブジェクトが特定のclassまたはtypeのインスタンスをチェックする.Python 2では,type () で構成された元組をisinstance () に渡すことができます.そのオブジェクトが元組の任意のタイプである場合,関数はTrue () を返します.Python 3では,あなたはまだそれを行うことができますが,タイプを参数として2回渡すことは推奨されません.
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x,(int,float,int)) | isinstance(x,(int,float)) |
Python 2 には2種類の文字列タイプがあります.Unicode でコードされた文字列と,Unicode でコードされていない文字列です.しかし,実際には別のタイプ,basestringがあります.これは抽象データ型であり,str と unicode の超クラスである.これは直接呼び出しまたはインスタンス化することはできませんが,インスタンスのパラメータとして使って,オブジェクトがUnicode 文字列か非Unicode 文字列かを検出できます.Python 3 では,文字列タイプが1つしかないので,basestringは存在する必要はありません.
| Notes | Python 2 | Python 3 |
|---|---|---|
| isinstance(x, basestring) | isinstance(x, str) |
Python 2.3 では,itertools モジュールが導入され,全局関数zip (),map (),filter (),の変数 (variant) が定義され,これらの変数の返却型はリストではなく,代入型である.Python 3 では,これらの全局関数の返却型が本来の代入型であるため,これらのitertools の変数関数は削除されました.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | itertools.izip(a, b) | zip(a, b) |
| ② | itertools.imap(a, b) | map(a, b) |
| ③ | itertools.ifilter(a, b) | filter(a, b) |
| ④ | from itertools import imap, izip, foo | from itertools import foo |
1 グローバルzip () 関数を使用し,itertools.izip () ではなく.
2 map (マップ) を使ってitertools.imap (マップ) を使わない.
3 itertools.ifilter ((() は filter ((() になった
4 itertools モジュールは Python 3 に残っているが,グローバルネームスペースに移行した関数を含まない. 2to3 スクリプトは,他のインポート文の整合性を維持しながら,もはや役に立たないインポート文を削除するのに十分な知性を持つ.
異例処理の際には,sysモジュール内に3つの変数があります.sys.exc_type,sys.exc_value,sys.exc_traceback。(実際は,これらはPython 1の時代に存在していました。) Python 1.5からは,新しいsys.exc_infoが登場したため,この3つの変数を使用することはもはや推奨されません.これは,上記の3つの要素をすべて含む元群です。Python 3では,この3つの変数は,最終的に存在しない.これは,sys.exc_infoを使用しなければならないことを意味します。
| Notes | Python 2 | Python 3 |
|---|---|---|
| sys.exc_type | sys.exc_info()[0] | |
| sys.exc_value | sys.exc_info()[1] | |
| sys.exc_traceback | sys.exc_info()[2] |
Python 2では,元組を巡るリスト解析を記述する場合は,元組の値の周りに括弧を加える必要はありません.Python 3では,括弧は必須です.
| Notes | Python 2 | Python 3 |
|---|---|---|
| [i for iin 1,2] | [i for iin(1,2)] |
Python 2 には os.getcwd() という関数があり,現在の作業目録を[[非Unicodeコード化]]の文字列として返します.現代のファイルシステムは何文字コード化可能な目録名を処理できるので,Python 2.3 では os.getcwdu() 函数。os.getcwdu() が導入され,現在の作業目録のUnicodeコード化文字列を返します。Python 3 では,文字列の種類は[[Unicode]]の種類のみなので,os.getcwd() のみが必要になります.
| Notes | Python 2 | Python 3 |
|---|---|---|
| os.getcwdu() | os.getcwd() |
Python 2 では,クラス宣言でメタクラスパラメータを定義したり,特定のクラスレベル (class-level) を定義したりできます.__metaclass_Python 3 では,このプロパティは,__metaclass_属性は削除されています.
| Notes | Python 2 | Python 3 |
|---|---|---|
| ① | class C(metaclass=PapayaMeta):<br> pass | unchanged |
| ② | class Whip:<br> _metaclass_ = PapayaMeta | class Whip(metaclass=PapayaMeta):<br> pass |
| ③ | class C(Whipper, Beater):<br> _metaclass_ = PapayaMeta | class C(Whipper,Beater,metaclass=PapayaMeta):<br> pass |
クラスを宣言するときにメタクラスパラメータを宣言する.これはPython 2とPython 3で同じです.
2. クラスの定義で,Python 2では有効だが,Python 3では有効ではない__metaclass__属性を宣言する.
3,2to3 は,そのクラスが複数の父クラスを継承しているにもかかわらず,有効なクラスの声明を構成できます.
以下に記載されている修正は,本質的に真の修正とは限らない。つまり,それらはコードのスタイルに関するものであって,コードの本質に関係しない。しかし,Pythonの開発者は,コードのスタイルを可能な限り一致させることに非常に興味を持っている。そのために,Pythonのコードのスタイルを記述する公式のガイドブックが特別に用意されている。
-
set (文字の値)
Python 2では,文字値集合 ((literal set) を定義する唯一の方法は set ((a_sequence) を呼び出すことである.Python 3では,これはまだ有効であるが,新しい標識符号 ((literal notation):大括弧 (({}) を使うことがより明確である.この方法は空集合以外にも有効である.辞書も大括弧で標識しているので,{}は空集合ではなく空辞典を表している.
2to3スクリプトはset ((() の文字値をデフォルトで修正しない.この機能を起動するには,コマンドラインで2to3を呼び出すときに-f set_literalパラメータを指定する.
| Notes | Before | After |
|---|---|---|
| set([1,2,3]) | {1,2,3} | |
| set((1,2,3)) | {1,2,3} | |
| set([i for iin a_sequence]) | {i for iin a_sequence} |
-
全局関数 buffer (((明示的な))
C で実装された Python オブジェクトは,他の Python コードがメモリを直接読み書きできるようにする,<unk>のバッファー インターフェースをエクスポートできます. (これは非常に強力で,それも同様に恐ろしいです.) Python 3 では,buffer () はmemoryview () として改名されました. (実際の変更はより複雑ですが,これらの違いをほとんど無視できます.)
2to3スクリプトでは,buffer () 関数をデフォルトで修正しません.この機能を起動するには,コマンドラインで2to3を呼び出すときに-f bufferパラメータを指定します.
| Notes | Before | After |
|---|---|---|
| x =buffer(y) | x =memoryview(y) |
-
コマの周りの空白 ((明示的に)
インデントとアウトデント (indenting and outdenting) の空白に対するPythonの要求は厳格であるが,空白の他の側面についてはPythonは自由である.リスト,モータ群,集合,辞書では,空白は引数の前後に現れるが,悪影響はない.しかし,Pythonのコードスタイルガイドブックでは,引数の前に空白があってはならないし,引数の後に空白が含まれるべきである.これは純粋に美学的な考察であるにもかかわらず, (コードはまだ正常に動作し,Python 2とPython 3で実行できます),しかし2to3スクリプトは,手帳の基準に従って,あなたのためにこの修復を行うことができます.
2to3スクリプトは,コマンドラインで 2to3 を呼び出すときに -f wscomma 参数指定して,この機能を起動します.
| Notes | Before | After |
|---|---|---|
| a ,b | a, b | |
| {a :b} | {a: b} |
-
慣習 (Common idioms) (明示的な)
Python コミュニティでは多くの慣習が確立されています.例えば,Python 1 に遡るwhile 1: loop のようなものがあります.Python は,Python 2.3 まで,真の意味でのブルタイプを持っていなかったので,開発者は以前,1 と 0 の代替を使用していました.現代の Python プログラマーは,これらの慣習の現代版を使用するために,彼らの脳を鍛えるべきです.
2to3スクリプトは,これらの慣習に対して,デフォルトで修正を行わない.この機能を起動するには,コマンドラインで2to3を呼び出すときに, -f idiomsパラメータを指定する.
| Notes | Before | After |
|---|---|---|
| while 1:<br> do_stuff() | while True:<br> do_stuff() | |
| type(x) == T | isinstance(x, T) | |
| type(x) is T | isinstance(x, T) | |
| a_list = list(a_sequence) | a_list = sorted(a_sequence) | |
| a_list.sort() | do_stuff(a_list) | |
| do_stuff(a_list) |
引用元:CSDNブログ
Python2のコードをPython3のコードに変換する方法
Python 2.x のコードをPython 3.x のコードに変換する方法について.
Python 2.x のコードを Python 3.x のコードに変換する方法
print など,ごく少数の関数しか関わらない場合,これは言うまでもありません.
じゃあ,自分でコードを改造してもいいですね.
Python 2.x バージョンは,私がインストールした Python 2.7.2 のように,Windowsでダウンロードしてインストールすると,いくつかの有用なツールが付属します.
Python 2.x のコードを Python 3.x のコードに変換するものです.
位置: Pythonのインストールルートディレクトリ\ Python27\ Tools\ Scripts\ 2to3.py
2to3.pyを利用して,Python 2.xのコードを,Python 3.xのコードに変換する方法
翻訳の仕方について説明します.
D:\tmp\tmp_dev_root\python\python2_to_python3\34563264_data_from_site.py
Python 3.x に変換するコードです.
Windows の cmd を開いて,変換するスクリプトの下に移動して実行できます.
D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
変換が成功すると,次の結果が得られます.
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -w 34563264_data_from_site.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 34563264_data_from_site.py
--- 34563264_data_from_site.py (original)
+++ 34563264_data_from_site.py (refactored)
@@ -18,7 +18,7 @@
import time;
import codecs;
import logging;
-import urllib;
+import urllib.request, urllib.parse, urllib.error;
from datetime import datetime,timedelta;
from optparse import OptionParser;
from string import Template,replace;
@@ -90,7 +90,7 @@
foundPhone = eachItemSoup.find(attrs={"class":"phone"});
logging.debug("foundPhone=%s", foundPhone);
if(foundPhone):
- foundPhoneUni = unicode(foundPhone);
+ foundPhoneUni = str(foundPhone);
logging.debug("foundPhoneUni=%s", foundPhoneUni);
# case 1:
#<p class="phone"><strong>phone:</strong> 800.206.7886<br />
@@ -122,7 +122,7 @@
foundWeb = eachItemSoup.find(attrs={"class":"web"});
logging.debug("foundWeb=%s", foundWeb);
if(foundWeb):
- foundWebUni = unicode(foundWeb);
+ foundWebUni = str(foundWeb);
logging.debug("foundWebUni=%s", foundWebUni);
# <p class="web"><strong>e-mail:</strong> <a href="#">[email protected]</a><br />
@@ -151,7 +151,7 @@
foundAddr = eachItemSoup.find(attrs={"class":"addr"});
logging.debug("foundAddr=%s", foundAddr);
if(foundAddr):
- foundAddrUni = unicode(foundAddr);
+ foundAddrUni = str(foundAddr);
# <p class="addr">
# <strong>address:</strong> 740 SW 21st Ave, Suite #310<br />
RefactoringTool: Files that were modified:
RefactoringTool: 34563264_data_from_site.py
この時点で,元の34563264_data_from_site.pyが Python 3.xのコードになっていることがわかります.
比較してみると,違いがわかる:
現在, 2to3.py自体については,以下のようにヘルプで確認できます.
D:\tmp\tmp_dev_root\python\python2_to_python3>D:\tmp\WordPress\DevRoot\Python27\Tools\Scripts\2to3.py -h
Usage: 2to3 [options] file|dir ...
Options:
-h, --help show this help message and exit
-d, --doctests_only Fix up doctests only
-f FIX, --fix=FIX Each FIX specifies a transformation; default: all
-j PROCESSES, --processes=PROCESSES
Run 2to3 concurrently
-x NOFIX, --nofix=NOFIX
Prevent a transformation from being run
-l, --list-fixes List available transformations
-p, --print-function Modify the grammar so that print() is a function
-v, --verbose More verbose logging
--no-diffs Don't show diffs of the refactoring
-w, --write Write back modified files
-n, --nobackups Don't write backups for modified files
この記事では,いくつかのことを説明します.
(1) 上記の -w 参数が加えられていない場合,従来の設定では,変換プロセスに対応するdiff コンテンツを現在のウィンドウにプリントするだけです.
(2) -w を加えると,変更された内容を元のファイルに戻す.
(3) バックファイルを作らないなら, -n を加える.
(4) 出力された内容を目にしたくなかったら,ノイディフを追加して,
興味のある方は自分で折り紙を折り続けてください.
この2to3の使い方は旅の途中で
この記事では,このページを編集して,誤りがあれば指摘してください._^

