Python 2.x.x と Python 3.x.x の間の変更点と Python 2.x.x を Python 3.x.x に変換する方法

作成日:: 2016-10-09 12:36:49, 更新日:: 2017-10-11 10:18:05
comments   2
hits   4926

python2とpython3の文法違い,変更

ほぼすべての Python 2 プログラムは,Python 3 の環境で正常に動作するためにいくつかの変更を必要とします.この変換プロセスを簡素化するために,Python 3 には2to3 と呼ばれる実用スクリプト ((Utility Script) が搭載されています.このスクリプトは,あなたの Python 2 プログラムのソースファイルをインプットとして,それを Python 3 の形式に自動的に変換します.

  • #### print 文について

Python 2では,print は文である。あなたが出力したいものは何であれ,print キーワードの後ろにそれを置くだけで出力できます。Python 3では,print ((() は関数である。他の関数と同様に,print ((() は,あなたが出力したいものを,その関数として渡す必要があります。

Notes Python 2 Python 3
print 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 ((() が別のパイプに輸出されます.

  • #### Unicode文字列について

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つの値間の比較

  • #### 辞書型の方法has_key()

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
  1. list () 関数が keys () の返り値を静的なリストに変換するので,セキュリティ上の考慮のために,2to3 はエラーを報告する可能性があります.このようなコードは有効ですが,ビューを使用する場合は効率が低いです.リストが必要かどうかを確認するために,変換したコードをチェックし,ビューも同じように動作するかもしれません. これは別の View ((items (() 方法の) をリストに変換するものです。2to3対values (() 方法の返り値の変換も同様です。
  2. 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
import SimpleHTTPServer
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 を分析,コード,取得するためのモジュールがいくつかありますが,これらのモジュールはマウスのように互いに重複しています.Python 3 では,これらのモジュールが再構成され,別個のパッケージ,urllibに組み込まれています.
Notes Python 2 Python 3
import urllib import urllib.request
urllib.parse,urllib.error
import urllib2 import urllib.request
urllib.error
import urlparse import urllib.parse
import robotparser import urllib.robotparser
from urllib import FancyURLopener
from urllib import urlencode
from urllib.request import FancyURLopener
from urllib.parse import urlencode
from urllib2 import Request
from urllib2 import HTTPError
from urllib.request import Request
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
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
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
import SimpleXMLRPCServer
import xmlrpc.server
  • #### 他のモジュール
Notes Python 2 Python 3
try:
  import cStringIO as StringIO
except ImportError:
  import StringIO
import io
try:
  import cPickle as pickle
except ImportError: 
  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
  1. Python 2では,通常,StringIOの代替としてcStringIOをインポートしようとします.失敗すると,StringIOをインポートします. Python 3では,これをしないでください.ioモジュールは,この問題を処理します. Python 3 では,pickle モジュールが自動的に処理しますので,これ以上はしないでください.
  2. builtins モジュールには,Python 言語全体で使われるグローバル関数,クラス,定数が含まれています. builtins モジュール内の特定の関数を再定義することは,このグローバル関数をあらゆるところで再定義することを意味します. 強力に聞こえますが,同時に恐ろしいものです.
  3. copyreg モジュールは,C言語で定義されたユーザーカスタムタイプに,pickle モジュールのサポートを追加した.
  4. queue モジュールは,生産者・消費者のキューを実現する.
  5. socketserverモジュールは,様々なソケットサーバを実装するための一般的な基礎クラスを提供する. 7 設定パーサーモジュールでINI-styleの設定ファイルを解析する.
  6. reprlib モジュールでは,内置関数repr (()) を再実装し,文字列が切断される前に表示される長さの制御を追加した.
  7. 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
  1. パッケージの他の部分からモジュール全体をインポートする必要がある場合,新しいfrom . import シンタジーを使用する。ここでの文号 (((.) は,現在のファイル ((universaldetector.py)) とあなたがインポートしたいファイル ((constants.py)) の間の相対的なパスを表している。この例では,この2つのファイルは同じディレクトリにあるため,単一の文号を使用しています。あなたはまた,親ディレクトリ (((from .. import anothermodule) または子ディレクトリからインポートすることもできます。
  2. 特定のクラスまたは関数を他のモジュールから直接あなたのモジュール名空間にインポートするには,インポートが必要なモジュール名に相対パスを加え,最後の斜線を削除します. この例では,mbcharsetprober.pyとuniversaldetector.pyは同じディレクトリにあり,相対パスの名前は文号です. あなたはまた,親ディレクトリから (from .. import anothermodule) または子ディレクトリからインポートすることができます.
  • #### 代入器の方法 (next)

Python 2では,代はnext (()) の方法を持ち,その配列の次の項を返します。Python 3でも同じことが成立しますが,今や新しい全局的な関数next (()) があり,それは代をパラメータとして使用します。

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:
  def next(self):
  pass|class A:
  def next(self):
  pass| |④|class A:
  def next(self, x, y):
  pass|no change | |⑤|next = 42
for an_iterator in a_sequence_of_iterators:
  an_iterator.next()|next = 42
for an_iterator in a_sequence_of_iterators:
  an_iterator.next() | 1. 最も簡単な例では,代数のnext () メソッドを呼び出すのをやめて,その代数の自己をグローバル関数next () にパラメータとして渡します. 2. もし返される値がイデュレータの関数である場合,この関数を呼び出して,その結果を next () 関数にパラメータとして渡します。。 2to3 スクリプトは,この変換を正しく実行できるほど知的なものです。) Python 3 では,特殊な方法の定義で, クラスを定義し,それを代数として使うことができます.next_実現するために. 4. もし,定義したクラスに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 ((() がリストを返したように正常に動作します.

  • #### 全球関数map (((

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 () の返される値はリストではなく代入器であるとしても,正しく動作します.

  • #### グローバル関数reduce ()

Python 3では,reduce () 関数はグローバル名字空間から削除され,fucntools モジュールに配置されています.

Notes Python 2 Python 3
reduce(a, b, c) from functools import reduce reduce(a, b, c)
  • #### グローバル関数apply ()

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 () 呼び出しを変換するのに十分な知性を持っています.

  • #### グローバル関数intern ())

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 (()) 関数にもこのような機能があります.

  • #### execfile 文言について

前の 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’))
  • #### repr (引数)

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 ()) 機能に変換するほど知的なものです。

  • #### try…exceptの文は,この文で使われています.

Python 2 から Python 3 への移行では,異常を捕捉する文法が少し変わった.

Notes Python 2 Python 3
try:
  import mymodule
except ImportError, e
  pass
try:
  import mymodule
except ImportError as e:
  pass
try:
  import mymodule
except (RuntimeError, ImportError), e
  pass
try:
  import mymodule
except (RuntimeError, ImportError) as e:
  pass
try:
  import mymodule
except ImportError:
  pass
no change
try:
  import mymodule
except:
  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でプログラムを中断した場合) のような異例を捕捉し,デビューをさらに困難にする可能性があります.

  • #### raise 文について

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
  1. ユーザが設定したエラーメッセージのない例外を投影し,この最も単純な形式では,文法が変更されません. Python 2 では,例外とエラーをコマで区切ります. Python 3 では,エラーをパラメータとして例外に転送します. Python 2 では,より複雑な文法で,ユーザが設定した stack trace の例外を投げ出すことができます.Python 3 では,これを行うことができますが,文法が全く違います. Python 3 では,この形式はもはやサポートされていません. 2to3 は,この文法を自動的に修正できないと警告します.
  • #### 生成器の throw メソッド

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
  1. シンプルな形式では,ユーザがカスタマイズしたエラーメッセージのない例外をジェネレータが投げる.この場合,Python 2からPython 3に文法的に変更はありません.
  2. ユーザが設定したエラーメッセージの例外が生成元に投げ出されれば,そのエラーメッセージの文字列 (エラー ストリング) を例外クラスに転送して,それをインスタンス化する必要があります. Python 2 は,例外のみの例外を投げ出すことをサポートしています. Python 3 は,この文法をサポートしていません. 2to3 は,このコードを手動で修正する必要があることを警告する警告メッセージを表示します.
  • #### グローバル関数xrange ()

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 () 函数がある場合,リスト解析は代器にも同様に有効であるため,返される値をリストに変換する必要はありません. 4 類似して,for ループは代器にも作用するので,ここでも何も変化しません. 5 ,関数sum ((() は代入器に作用するので,2to3もここで変更をしていない。 値がview ((view) として返され,リストではなく辞書クラスの方法のように,これはmin (((),max (((),sum (((),list (((),tuple (((),set (((),sorted (((),any (((),all ((() にも適用する.

  • #### グローバル関数raw_input ()) とinput ())

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 ((() に渡すことができます.

  • #### 関数の属性func_*

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) は,コンパイルされた関数体を表示するコードオブジェクトである.

  • #### I/O 方法xreadlines (読み込みライン)

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 との効率は相違ありません。

  • #### 複数関数ではなく元組を使用するlambda関数

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_
  • #### __nonzero_特別な方法

Python 2では,自分のクラスを作成し,ブル上の文脈 (boolean context) で使用できるようにします. 例えば,このクラスをインスタンス化して,このインスタンスオブジェクトをif文で使います.nonzero() メソッドは,TrueまたはFalseを返します. このメソッドは,インスタンスオブジェクトがブル上の文脈にあるときに呼び出されます. Python 3では,同じ機能を実行できます. しかし,この特殊なメソッドの名前は,bool()。

Notes Python 2 Python 3

|①|class A:
  def nonzero(self):
  pass|class A:
  def bool(self):
  pass |②|class A:
  def nonzero(self, x, y):
  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

長整型と整型が統合されたため,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になる。

  • #### グローバル関数callable ((()

Python 2では,callable () というグローバル関数を使って,あるオブジェクトが呼び出されるかどうかを確認できます.Python 3では,このグローバル関数は削除されています.オブジェクトが呼び出されるかどうかを確認するには,特殊な方法を使用できます.__call_存在性について

Notes Python 2 Python 3
callable(anything) hasattr(anything,’_call_’)
  • #### グローバル関数 (zip)

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 モジュール内の常数

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のstring (非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))
  • #### basestring データ型

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)
  • #### itertools モジュール

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.exc_type, sys.exc_value, sys.exc_traceback

異例処理の際には,sysモジュール内に3つの変数があります.sys.exc_type,sys.exc_value,sys.exc_traceback。(実際は,これらはPython 1の時代に存在していました。) Python 1.5からは,新しいsys.exc_infoが登場したため,この3つの変数を使用することはもはや推奨されません.これは,上記の3つの要素をす