Python3.4の新機能
- 著者
デビッドマレー< [email protected] >(編集者)
この記事では、3.3と比較したPython3.4の新機能について説明します。 Python3.4は2014年3月16日にリリースされました。 詳細については、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
- Python3.4では新しい構文機能は追加されていません。
その他の新機能:
- pipは常に使用可能である必要があります( PEP 453 )。
- 新しく作成されたファイル記述子は継承できません( PEP 446 )。
- 分離モードのコマンドラインオプション(:issue: `16499` )。
- テキストエンコーディングではないコーデックの処理の改善(複数の問題)。
- インポートシステムのModuleSpecタイプ( PEP 451 )。 (輸入業者の作者に影響します。)
- マーシャルフォーマットがよりコンパクトで効率的に(:issue: `16475` )になりました。
新しいライブラリモジュール:
- asyncio :非同期IO 用の新しい暫定API( PEP 3156 )。
- ensurepip : pipインストーラーのブートストラップ( PEP 453 )。
- enum :列挙型のサポート( PEP 435 )。
- pathlib :オブジェクト指向ファイルシステムパス( PEP 428 )。
- セレクター: [[#whatsnew-selectors|]] select モジュールプリミティブ( PEP 3156の一部)に基づいて構築された、高レベルで効率的なI / O多重化 )。
- statistics :基本的な数値的に安定した統計ライブラリ( PEP 450 )。
- tracemalloc :トレースPythonメモリ割り当て( PEP 454 )。
大幅に改善されたライブラリモジュール:
- [[#whatsnew-singledispatch|]] functools ( PEP 443 )のシングルディスパッチジェネリック関数。
- 新しい pickle プロトコル4 ( PEP 3154 )。
- マルチプロセッシングに Unix でのos.forkの使用を回避するオプションが追加されました(:issue: `8713` )。
- email には、新しいサブモジュール contentmanager と、がMIME処理を簡素化する新しい Message サブクラス(
EmailMessage
)があります( :issue: `18891` )。 - inspect および pydoc モジュールは、はるかに多様な呼び出し可能オブジェクトを正しくイントロスペクトできるようになり、Python help()システムの出力が向上します。
- ipaddress モジュールAPIが安定していると宣言されました
セキュリティの改善:
- 安全で交換可能なハッシュアルゴリズム( PEP 456 )。
- 新しく作成されたファイル記述子を継承不可( PEP 446 )にして、ファイル記述子が子プロセスにリークしないようにします。
- 分離モードの新しいコマンドラインオプション(:issue: `16499` )。
- マルチプロセッシングに Unix でのos.forkの使用を回避するオプションが追加されました。 spawn と forkserver は、子プロセスとのデータ共有を回避するため、より安全です。
- Windows上の multiprocessing 子プロセスは、親の継承可能なハンドルのすべてを継承するのではなく、必要なハンドルのみを継承します。
- 新しい hashlib.pbkdf2_hmac()関数は、 PKCS#5パスワードベースの鍵導出関数2 を提供します。
- TLSv1.1およびTLSv1.2は ssl のをサポートします。
- [[#whatsnew34-win-cert-store|]] ssl のWindowsシステム証明書ストアサポートから証明書を取得しています。
- [[#whatsnew34-sni|]] ssl のサーバー側SNI(サーバー名表示)サポート。
- ssl.SSLContext クラスには、多くの改善点があります。
- SSLをサポートする標準ライブラリのすべてのモジュールは、ホスト名マッチング( ssl.match_hostname())やCRL(証明書失効リスト、 ssl.SSLContext.load_verify_locations()[)を含むサーバー証明書検証をサポートするようになりました。 X244X])。
CPython実装の改善:
- セーフオブジェクトファイナライズ( PEP 442 )。
- PEP 442 を利用して、ほとんどの場合、モジュールグローバルはファイナライズ(:issue: `18214` )中にNoneに設定されなくなりました。
- 構成可能なメモリアロケータ( PEP 445 )。
- 引数クリニック( PEP 436 )。
他の多くの小さな改善、CPythonの最適化、非推奨、潜在的な移植の問題など、ユーザー向けの変更の包括的なリストをお読みください。
新機能
PEP 453:PythonインストールでのPIPの明示的なブートストラップ
デフォルトでのブートストラップピップ
新しい ensurepip モジュール( PEP 453 で定義)は、pipインストーラーをPythonインストールおよび仮想環境にブートストラップするための標準のクロスプラットフォームメカニズムを提供します。 Python3.4.0に含まれているpip
のバージョンはpip
1.5.4であり、将来の3.4.xメンテナンスリリースでは、バンドルされているバージョンがpip
の最新バージョンに更新されます。リリース候補の作成時に利用可能です。
デフォルトでは、コマンドpipX
およびpipX.Y
は、pip
Pythonパッケージとその依存関係。 Windowsおよびすべてのプラットフォームの仮想環境では、バージョン管理されていないpip
コマンドもインストールされます。 他のプラットフォームでは、システム全体のバージョン管理されていないpip
コマンドは、通常、個別にインストールされたPython2バージョンを参照します。
pyvenv
コマンドラインユーティリティと venv モジュールは、 ensurepip モジュールを利用して、pip
を仮想環境ですぐに利用できるようにします。 コマンドラインユーティリティを使用する場合、デフォルトでpip
がインストールされますが、 venv モジュールを使用する場合は API のインストールを明示的に要求する必要があります。
CPython ソースビルドがPOSIXシステムの場合、make install
およびmake altinstall
コマンドはデフォルトでpip
をブートストラップします。 この動作は、configureオプションを介して制御し、Makefileオプションを介してオーバーライドできます。
WindowsおよびMacOS Xでは、CPythonインストーラーはデフォルトでpip
をCPython自体と一緒にインストールするようになりました(ユーザーはインストールプロセス中にインストールをオプトアウトできます)。 ウィンドウユーザーは、自動PATH
変更をオプトインして、デフォルトでコマンドラインからpip
を使用できるようにする必要があります。そうしないと、Windows用のPythonランチャーから [としてアクセスできます。 X218X]。
PEP で説明されているように、プラットフォームパッケージャーは、呼び出されたときに、そのプラットフォームにコマンドをインストールする方法(通常はシステムを使用)について明確で簡単な指示を提供する限り、デフォルトでこれらのコマンドをインストールしないことを選択できます。パッケージマネージャー)。
ノート
Python2とPython3の並列インストール間の競合を回避するために、ensurepip
が直接呼び出された場合、デフォルトではバージョン管理されたpip3
およびpip3.4
コマンドのみがブートストラップされます- [X198X ]オプションは、バージョン管理されていないpip
コマンドも要求するために必要です。 pyvenv
とWindowsインストーラーは、修飾されていないpip
コマンドがこれらの環境で使用できるようにし、pip
は常に-m
スイッチを介して呼び出すことができます。複数のPythonがインストールされているシステムでのあいまいさを回避するために直接。
ドキュメントの変更
この変更の一環として、ドキュメントの Pythonモジュールのインストールおよび Pythonモジュールの配布セクションが、簡単な開始およびFAQドキュメントとして完全に再設計されました。 ほとんどのパッケージドキュメントは、Python PackagingAuthorityが管理する PythonPackagingユーザーガイドと個々のプロジェクトのドキュメントに移動されました。
ただし、この移行は現在まだ完了していないため、これらのガイドのレガシーバージョンは、 Pythonモジュールのインストール(レガシーバージョン)および Pythonモジュールの配布(レガシーバージョン)として引き続き利用できます。
も参照してください
- PEP 453 –Pythonインストールでのpipの明示的なブートストラップ
- DonaldStufftとNickCoghlanによって作成されたPEPは、Donald Stufft、Nick Coghlan、MartinvonLöwisおよびNedDeilyによって実装されました。
PEP 446:新しく作成されたファイル記述子は継承できません
PEP 446 は、新しく作成されたファイル記述子を継承不可にします。 一般に、これはアプリケーションが望む動作です。新しいプロセスを起動するときに、現在開いているファイルも新しいプロセスで開いていると、あらゆる種類の見つけにくいバグが発生し、セキュリティの問題が発生する可能性があります。
ただし、継承が必要な場合があります。 これらのケースをサポートするために、次の新しい関数とメソッドが使用可能です。
コーデック処理の改善
codecs モジュールは、最初に導入されて以来、常にタイプニュートラルな動的エンコーディングおよびデコーディングシステムとして動作することを目的としてきました。 ただし、Pythonテキストモデルとの緊密な結合、特に組み込みの str 、 bytes 、および bytearray 型の型制限コンビニエンスメソッドは、歴史的にその事実を覆い隠してきました。 。
状況を明確にするための重要なステップとして、 codecs.encode()および codecs.decode()コンビニエンス関数がPython 2.7、3.3、および3.4で適切に文書化されるようになりました。 これらの関数は、Python 2.4以降コーデックモジュールに存在し(回帰テストスイートでカバーされています)、以前はランタイムイントロスペクションによってのみ検出可能でした。
の便利な方法とは異なり str 、 バイトと bytearray 、 NS コーデック便利な関数は、Unicodeテキストエンコーディング(Python 3)に限定されるのではなく、Python2とPython3の両方で任意のコーデックをサポートします。basestring
basestring
変換(Python 2の場合)。
Python 3.4では、インタプリタは標準ライブラリで提供されている既知の非テキストエンコーディングを識別し、必要に応じてこれらの汎用の便利な関数にユーザーを誘導できます。
>>> b"abcdef".decode("hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs
>>> "hello".encode("rot13")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>> open("foo.txt", encoding="hex")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs
関連する変更では、下位互換性を損なうことなく実行可能な場合は常に、エンコードおよびデコード操作中に発生した例外は、エラーの生成に関与するコーデックの名前に言及する同じタイプの連鎖例外にラップされます。
>>> import codecs
>>> codecs.decode(b"abcdefgh", "hex")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
return (binascii.a2b_hex(input), len(input))
binascii.Error: Non-hexadecimal digit found
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)
>>> codecs.encode("hello", "bz2")
Traceback (most recent call last):
File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
return (bz2.compress(input), len(input))
File "/usr/lib/python3.4/bz2.py", line 498, in compress
return comp.compress(data) + comp.flush()
TypeError: 'str' does not support the buffer interface
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)
最後に、上記の例が示すように、これらの改善により、Python3.2で復元された非Unicodeコーデックの便利なエイリアスの復元が可能になりました。 これは、(たとえば)16進表現との間のバイナリデータのエンコードを次のように記述できることを意味します。
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
標準ライブラリで提供されているバイナリ変換とテキスト変換については、バイナリ変換とテキスト変換で詳しく説明されています。
(:issue: `7475` 、:issue:` 17827` 、:issue: `17828` 、:issueでNickCoghlanが寄稿: `19619` 。)
PEP 451:インポートシステムのModuleSpecタイプ
PEP 451 は、インポートマシンがモジュールをロードするために使用するモジュールに関する情報(つまり、モジュール仕様)のカプセル化を提供します。 これにより、インポートの実装といくつかのインポート関連のAPIの両方が簡素化されます。 この変更は、いくつかの将来のインポート関連の改善の足がかりにもなります。
PEPからの公開された変更は、完全に下位互換性があります。 さらに、それらは輸入者の作者以外のすべての人に透過的でなければなりません。 キーファインダーとローダーのメソッドは非推奨になりましたが、引き続き機能します。 新しい輸入業者は、PEPで説明されている新しい方法を使用する必要があります。 新しいメソッドを実装するには、既存のインポーターを更新する必要があります。 置き換える必要のあるメソッドとその置き換えのリストについては、非推奨セクションを参照してください。
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
- UnicodeデータベースがUCDバージョン6.3に更新されました。
- min()および max()は、 default キーワードのみの引数を受け入れるようになりました。この引数を使用して、評価している反復可能オブジェクトが持っている場合に返す値を指定できます。要素はありません。 (:issue: `18111` でJulianBermanによって寄稿されました。)
- モジュールオブジェクトが weakref '可能になりました。
- モジュール
__file__
属性(および関連する値)には、スクリプトが相対パスを使用して直接実行された場合の__main__.__file__
を除いて、デフォルトで常に絶対パスが含まれるようになりました。 (:issue: `18416` のBrettCannonによる寄稿。) surrogatepass
エラーハンドラーが使用されていない限り、すべてのUTF- *コーデック(UTF-7を除く)はエンコードとデコードの両方でサロゲートを拒否するようになりました。ただし、UTF-16デコーダー(有効なサロゲートペアを受け入れる)とUTF-16エンコーダー(非BMP文字のエンコード中にそれらを生成します)。 (:issue: `12892` のVictorStinner、Kang-Hao(Kenny)Lu、Serhiy Storchakaによる寄稿。)- 新しいドイツ語EBCDIC コーデック
cp273
。 (:issue: `1097797` でMichaelBierenfeldとAndrewKuchlingによって寄稿されました。) - 新しいウクライナ語コーデック
cp1125
。 (:issue: `19668` でSerhiyStorchakaによって寄稿されました。) - bytes .join()および bytearray .join()は、引数として任意のバッファーオブジェクトを受け入れるようになりました。 (:issue: `15958` のAntoinePitrouによる寄稿。)
- int コンストラクターは、 base 引数に
__index__
メソッドを持つすべてのオブジェクトを受け入れるようになりました。 (:issue: `16772` でMarkDickinsonによって寄稿されました。) - フレームオブジェクトには、フレームからローカル変数へのすべての参照をクリアする clear()メソッドが含まれるようになりました。 (:issue: `17934` のAntoinePitrouによる寄稿。)
- memoryview は Sequence として登録され、 reverse()ビルトインをサポートします。 (:issue: `18690` および:issue:` 19078` でNickCoghlanおよびClaudiuPopaによって寄稿されました。)
- help()によって報告された署名は、 inspect および pydoc モジュールへの引数クリニックの導入およびその他の変更の結果として、いくつかのケースで変更および改善されました。 。
- __ length_hint __()は、正式な言語仕様の一部になりました( PEP 424 を参照)。 (:issue: `16148` でArminRonacherによって寄稿されました。)
新しいモジュール
asyncio
新しい asyncio モジュール( PEP 3156 で定義)は、Pythonの標準のプラグ可能なイベントループモデルを提供し、標準ライブラリで確実な非同期IOサポートを提供します。他のイベントループの実装が標準ライブラリと相互運用しやすくなります。
Python 3.4の場合、このモジュールは暫定API と見なされます。
surepip
新しい ensurepip モジュールは、 PEP 453 実装の主要なインフラストラクチャです。 通常のイベントでは、エンドユーザーはこのモジュールを操作する必要はありませんが、インストールまたは仮想環境への自動ブートストラップが拒否された場合は、手動でpip
をブートストラップするために使用できます。
ensurepip には、pip
のバンドルコピーが含まれています。これは、同梱されているCPythonのリリースの最初のリリース候補の時点で最新のものです(これは、メンテナンスリリースと機能リリースの両方に適用されます)。 。 ensurepip
はインターネットにアクセスしません。 インストールにインターネットアクセスがある場合、ensurepip
の実行後、バンドルされたpip
を使用して、pip
をバンドルされたリリースよりも新しいリリースにアップグレードできます。 (このようなアップグレードされたバージョンのpip
は、個別にインストールされたパッケージと見なされ、Pythonがアンインストールされても削除されないことに注意してください。)
このモジュールの名前は ensure pipです。これは、pip
が既にインストールされているときに呼び出された場合、何も実行されないためです。 また、--upgrade
オプションがあり、既存のインストール済みバージョンのpip
がバンドルされたコピーよりも古い場合、pip
のバンドルされたコピーをインストールします。
列挙型
新しい enum モジュール( PEP 435 で定義)は、列挙型の標準実装を提供し、他のモジュール( socket など)を許可します。不透明な整数定数を下位互換性のある列挙値に置き換えることにより、より有益なエラーメッセージとより優れたデバッグサポートを提供します。
も参照してください
- PEP 435 –Python標準ライブラリへの列挙型の追加
- Barry Warsaw、Eli Bendersky、Ethan Furmanによって作成されたPEPは、EthanFurmanによって実装されました。
pathlib
新しい pathlib モジュールは、さまざまなオペレーティングシステムに適したセマンティクスでファイルシステムパスを表すクラスを提供します。 パスクラスは、I / Oなしの純粋な計算操作を提供する純粋なパスと、純粋なパスから継承するがI / O操作も提供する具象パスに分けられます。
Python 3.4の場合、このモジュールは暫定API と見なされます。
セレクター
新しい selectors モジュール( PEP 3156 の実装の一部として作成)は、 select [に基づいて構築された高レベルで効率的なI / O多重化を可能にします。 X170X]モジュールプリミティブ。
統計
新しい statistics モジュール( PEP 450 で定義)は、いくつかのコア統計機能を標準ライブラリで直接提供します。 このモジュールは、データ系列の平均、中央値、最頻値、分散、および標準偏差の計算をサポートします。
tracemalloc
新しい tracemalloc モジュール( PEP 454 で定義)は、Pythonによって割り当てられたメモリブロックをトレースするためのデバッグツールです。 次の情報を提供します。
- オブジェクトが割り当てられた場所をトレースします
- ファイル名ごとおよび行番号ごとに割り当てられたメモリブロックの統計:割り当てられたメモリブロックの合計サイズ、数、および平均サイズ
- 2つのスナップショットの差を計算して、メモリリークを検出します
改善されたモジュール
abc
新しい関数 abc.get_cache_token()を使用して、オブジェクトグラフの変更によって影響を受けるキャッシュをいつ無効にするかを知ることができます。 (:issue: `16832` のŁukaszLangaによる寄稿。)
新しいクラス ABC には、メタクラスとして ABCMeta があります。 ABC
を基本クラスとして使用すると、基本的にmetaclass=abc.ABCMeta
を指定するのと同じ効果がありますが、入力が簡単で読みやすくなります。 (:issue: `16049` のBrunoDupuisによる寄稿。)
aifc
getparams()メソッドは、プレーンタプルではなく名前付きタプルを返すようになりました。 (:issue: `17818` のClaudiuPopaによる寄稿。)
aifc.open()がコンテキスト管理プロトコルをサポートするようになりました。 with ブロックで使用すると、返されたオブジェクトの close()メソッドが自動的に呼び出されます。ブロックの終わりに。 (:issue: `16486` のSerhiyStorchachaによる寄稿。)
writeframesraw()および writeframes()メソッドは、バイトのようなオブジェクトを受け入れるようになりました。 (:issue: `8311` のSerhiyStorchakaによる寄稿。)
argparse
FileType クラスは、 encoding および errors 引数を受け入れるようになりました。これらは、 open()に渡されます。 (:issue: `11175` でLucasMaystreによって寄稿されました。)
audioop
audioop は24ビットサンプルをサポートするようになりました。 (:issue: `12866` でSerhiyStorchakaによって寄稿されました。)
新しい byteswap()関数は、ビッグエンディアンのサンプルをリトルエンディアンに、またはその逆に変換します。 (:issue: `19641` でSerhiyStorchakaによって寄稿されました。)
すべての audioop 関数は、バイトのようなオブジェクトを受け入れるようになりました。 文字列は受け入れられません。以前は機能していませんでしたが、すぐにエラーが発生します。 (:issue: `16685` のSerhiyStorchakaによる寄稿。)
base64
base64 のエンコードおよびデコード関数は、以前に bytes または bytearray インスタンスが必要だった場合に、 bytesのようなオブジェクトを受け入れるようになりました。 (:issue: `17839` でNickCoghlanによって寄稿されました。)
新しい関数 a85encode()、 a85decode()、 b85encode()、および b85decode()は、バイナリをエンコードおよびデコードする機能を提供しますAscii85
およびgit / mercurial Base85
形式との間のデータ。 a85
関数には、Adobeバリアントを含むAscii85
エンコーディングのバリアントと互換性を持たせるために使用できるオプションがあります。 (Martin Morrison、Mercurialプロジェクト、Serhiy Storchaka、およびAntoine Pitrouが:issue: `17618` で寄稿しました。)
コレクション
ChainMap.new_child()メソッドは、チェーンに追加する子マップを指定する m 引数を受け入れるようになりました。 これにより、既存のマッピングやカスタムマッピングタイプを子に使用できます。 (:issue: `16613` でVinaySajipによって寄稿されました。)
colorsys
RGB — YIQ変換の係数の桁数が拡張され、FCCNTSCバージョンと一致するようになりました。 結果の変化は1%未満である必要があり、他の場所で見つかった結果とより一致する可能性があります。 (:issue: `14323` でBrianLandersとSerhiyStorchakaによって寄稿されました。)
contextlib
新しい contextlib.suppress コンテキストマネージャーは、単一のステートメントからの例外を意図的に抑制するコードの意図を明確にするのに役立ちます。 (:issue: `15806` のRaymondHettingerと:issue:` 19266` のZeroPiraeusによる寄稿。)
新しい contextlib.redirect_stdout()コンテキストマネージャーを使用すると、ユーティリティスクリプトが出力を sys.stdout に書き込む柔軟性のないAPIを簡単に処理でき、リダイレクトするオプションが提供されません。 コンテキストマネージャーを使用すると、 sys.stdout 出力を他のストリームにリダイレクトしたり、 io.StringIO と組み合わせて文字列にリダイレクトしたりできます。 後者は、たとえば、コマンドラインインターフェイスを実装するために作成された関数からの出力をキャプチャする場合に特に役立ちます。 sys.stdout のグローバル状態に影響するため、ユーティリティスクリプトにのみお勧めします。 (:issue: `15805` でRaymondHettingerによって寄稿されました。)
contextlib のドキュメントも更新され、シングルユース、再利用可能、および再入可能なコンテキストマネージャーの違いに関するディスカッションが含まれるようになりました。
dbm
dbm.open()オブジェクトがコンテキスト管理プロトコルをサポートするようになりました。 with ステートメントで使用すると、データベースオブジェクトのclose
メソッドがブロックの最後で自動的に呼び出されます。 (:issue: `19282` でClaudiuPopaとNickCoghlanによって寄稿されました。)
dis
関数 show_code()、 dis()、 distb()、および disassemble()は、キーワードのみを受け入れるようになりました file 引数。出力を書き込む場所を制御します。
dis モジュールは、個々のバイトコード操作の詳細へのオブジェクト指向アクセスを提供する Instruction クラスを中心に構築されています。
新しいメソッド get_instructions()は、指定されたPythonコードの命令ストリームを発行するイテレーターを提供します。 したがって、 dis モジュール自体が提供する方法とは異なる方法でバイトコードオブジェクトを検査および操作するプログラムを作成できるようになりました。 例えば:
>>> import dis
>>> for instr in dis.get_instructions(lambda x: x + 1):
... print(instr.opname)
LOAD_FAST
LOAD_CONST
BINARY_ADD
RETURN_VALUE
dis モジュールのさまざまな表示ツールは、これらの新しいコンポーネントを使用するように書き直されました。
さらに、新しいアプリケーションフレンドリークラス Bytecode は、人間が読める形式のバイトコードを検査し、命令を反復処理するためのオブジェクト指向APIを提供します。 Bytecode コンストラクターは、get_instruction()
と同じ引数(およびオプションの current_offset )を取り、結果のオブジェクトを繰り返して Instruction を生成できます。オブジェクト。 ただし、 dis メソッドもあります。これは、コンストラクター引数で dis を呼び出すのと同じですが、複数行の文字列として返されます。
>>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
>>> for instr in bytecode:
... print('{} ({})'.format(instr.opname, instr.opcode))
LOAD_FAST (124)
LOAD_CONST (100)
BINARY_ADD (23)
RETURN_VALUE (83)
>>> bytecode.dis().splitlines()
[' 1 0 LOAD_FAST 0 (x)',
' --> 3 LOAD_CONST 1 (1)',
' 6 BINARY_ADD',
' 7 RETURN_VALUE']
Bytecode には、トレースバックを操作する機能を提供するクラスメソッド from_traceback()もあります(つまり、print(Bytecode.from_traceback(tb).dis())
はdistb(tb)
と同等です] )。
(:issue: `11816` のNickCoghlan、Ryan Kelly、Thomas Kluyver、:issue:` 17916` のClaudiuPopaによる寄稿。)
新しい関数 stack_effect()は、指定されたオペコードと引数のPythonスタックへの影響を計算します。これは、他の方法では利用できない情報です。 (:issue: `19722` のLarryHastingsによる寄稿。)
doctest
新しいオプションフラグ、 FAIL_FAST は、最初の障害が検出されるとすぐにテストの実行を停止します。 (Rによる寄稿。 のDavidMurrayとDanielUrban:issue: `16522` 。)
doctest コマンドラインインターフェイスは argparse を使用するようになり、-o
と-f
の2つの新しいオプションが追加されました。 -o
でサポートされている同様のオプションと同等です。 X171X] unittest CLI)。 (Rによる寄稿。 :issue: `11390` のDavidMurray。)
doctest は、拡張モジュール__doc__
文字列でdoctestを検出するようになりました。 (:issue: `3158` のZacharyWareによる寄稿。)
Eメール
as_string()は、 policy 引数を受け入れて、メッセージの文字列表現を生成するときにメッセージのデフォルトポリシーをオーバーライドするようになりました。 これは、フォーマットパラメータをflatten
メソッドに渡すために、ジェネレーターを作成して使用する代わりに、as_string
をより多くの状況で使用できることを意味します。 (Rによる寄稿。 のDavidMurray:issue: `18600` 。)
as_string
が文字列表現を生成するのと同様の方法でメッセージのバイト表現を生成するために、新しいメソッド as_bytes()が追加されました。 maxheaderlen 引数は受け入れませんが、 unixfrom および policy 引数は受け入れます。 Message __ bytes __()メソッドがそれを呼び出します。つまり、bytes(mymsg)
は、完全にフォーマットされたメッセージを含むバイトオブジェクトという直感的な結果を生成します。 (Rによる寄稿。 のDavidMurray:issue: `18600` 。)
Message.set_param()メッセージは、 replace キーワード引数を受け入れるようになりました。 指定すると、関連するヘッダーは、ヘッダーのリスト内の場所を変更せずに更新されます。 下位互換性のために、デフォルトはFalse
です。 (Rによる寄稿。 のDavidMurray:issue: `18891` 。)
Message の新しいサブクラスのペア( EmailMessage および MIMEPart )が、新しいサブモジュール contentmanager および新しいポリシー属性 content_manager 。 現在、すべてのドキュメントは新しいモジュールに含まれています。このモジュールは、メールの新しい暫定API の一部として追加されています。 これらのクラスは、電子メールメッセージからのコンテンツの抽出と電子メールメッセージへのコンテンツの挿入をはるかに簡単にする多くの新しいメソッドを提供します。 詳細については、 contentmanager のドキュメントおよび email:Examples を参照してください。 これらのAPIの追加により、email6プロジェクトの一部として計画された作業の大部分が完了します。 現在暫定的なAPIは、Python 3.5で最終的になる予定です(エラー処理の領域でいくつかのマイナーな追加が行われる可能性があります)。 (Rによる寄稿。 のDavidMurray:issue: `18891` 。)
filecmp
新しい clear_cache()関数は、 filecmp 比較キャッシュをクリアする機能を提供します。このキャッシュは、 os.stat()情報を使用して、ファイルが変更されたかどうかを判断します。最後の比較。 これは、たとえば、特定のファイルシステムのファイル変更時間フィールドの解像度よりも短い時間でファイルが変更および再チェックされた可能性がある場合に使用できます。 (:issue: `18149` のMarkLevittによる寄稿。)
新しいモジュール属性 DEFAULT_IGNORES は、 dircmp()関数の ignore パラメーターのデフォルト値として使用されるディレクトリーのリストを提供します。 (:issue: `15442` でEliBenderskyによって寄稿されました。)
functools
新しい partialmethod()記述子は、 partial()が通常の呼び出し可能オブジェクトを提供するのと同じように、部分引数アプリケーションを記述子にもたらします。 新しい記述子により、クラス定義に含まれている場合、任意の呼び出し可能オブジェクト( partial()インスタンスを含む)を通常のインスタンスメソッドのように動作させることも簡単になります。 (:issue: `4331` でAlonHorevとNickCoghlanによって寄稿されました。)
新しい singledispatch()デコレータは、Python標準ライブラリにシングルディスパッチジェネリック関数のサポートをもたらします。 オブジェクト指向プログラミングが共通のデータセットに対する複数の操作をクラスにグループ化することに焦点を当てているのに対し、総称関数は、異なる種類のデータを処理できるようにする操作の複数の実装をグループ化することに焦点を当てています。
total_ordering()は、基になる比較関数からの NotImplemented の戻り値をサポートするようになりました。 (:issue: `10042` でKatieMillerによって寄稿されました。)
partial()関数の純粋なPythonバージョンがstdlibにあります。 CPythonでは、Cアクセラレーションバージョンによってオーバーライドされますが、他の実装で使用できます。 (:issue: `12428` でBrianThorneによって寄稿されました。)
gc
新しい関数 get_stats()は、インタープリターの起動以降のコレクション統計を含む3つの世代ごとの辞書のリストを返します。 (:issue: `16351` のAntoinePitrouによる寄稿。)
グロブ
新しい関数 escape()は、ファイル名内の特殊文字をエスケープする方法を提供します。これにより、特殊文字はグロブ展開の一部にはならず、文字通り一致します。 (:issue: `8402` のSerhiyStorchakaによる寄稿。)
hashlib
新しい hashlib.pbkdf2_hmac()関数は、 PKCS#5パスワードベースの鍵導出関数2 を提供します。 (:issue: `18582` でChristianHeimesによって寄稿されました。)
hashlib ハッシュオブジェクトの name 属性は、正式にサポートされるインターフェイスになりました。 これはCPythonの hashlib に常に存在していましたが(サポートされているすべてのハッシュに対して小文字の名前は返されませんでした)、パブリックインターフェイスではなかったため、他の一部のPython実装では以前はサポートされていませんでした。 (JasonRによる寄稿。 のクーム:issue: `18532` 。)
hmac
hmac は、 new()関数の key 引数にbytearray
とbytes
を受け入れるようになりました。 new()関数と update()メソッドの両方のX127X] msg パラメーターは、 hashlib モジュールでサポートされるすべての型を受け入れるようになりました。 (:issue: `18240` のJonasBorgströmによる寄稿。)
hmac.new()関数の digestmod 引数は、 hashlib によって認識される任意のハッシュダイジェスト名になります。 さらに、 digestmod の値がデフォルトでMD5
になる現在の動作は非推奨になりました。将来のバージョンのPythonでは、デフォルト値はありません。 (:issue: `17276` のChristianHeimesによる寄稿。)
block_size および name 属性(および digest_size 属性の正式なドキュメント)の追加により、 hmac モジュールは完全にに準拠するようになりました。 PEP 247 API。 (:issue: `18775` でChristianHeimesによって寄稿されました。)
html
新しい関数 unescape()関数は、HTML5文字参照を対応するUnicode文字に変換します。 (:issue: `2927` のEzioMelottiによる寄稿。)
HTMLParser は、新しいキーワード引数 convert_charrefs を受け入れます。これは、True
の場合、すべての文字参照を自動的に変換します。 下位互換性のために、その値のデフォルトはFalse
ですが、Pythonの将来のバージョンではTrue
に変更されるため、明示的に設定し、この新しいコードを使用するようにコードを更新することをお勧めします特徴。 (:issue: `13633` のEzioMelottiによる寄稿。)
HTMLParser の strict 引数は非推奨になりました。 (:issue: `15114` のEzioMelottiによる寄稿。)
http
send_error()は、オプションの追加の Explain パラメーターを受け入れるようになりました。これを使用して、拡張エラーの説明を提供し、ハードコードされたデフォルトがある場合はそれをオーバーライドします。 この拡張エラーの説明は、error_message_format
属性を使用してフォーマットされ、エラー応答の本文として送信されます。 (:issue: `12921` でKarlCowによって寄稿されました。)
http.server コマンドラインインターフェイスに、サーバーが特定のアドレスでリッスンするようにする-b/--bind
オプションが追加されました。 (:issue: `17764` のMalteSwartによる寄稿。)
idlelibとIDLE
idlelibはIDLEシェルとエディターを実装し、他のプログラムによるインポートを目的としていないため、リリースごとに改善されます。 3.3.0以降の変更の累積リスト、および将来の3.4.xリリースで行われた変更については、Lib/idlelib/NEWS.txt
を参照してください。 このファイルは、IDLE ダイアログからも入手できます。
importlib
InspectLoader ABCは、ソースデータとパスを受け入れてコードオブジェクトを返す新しいメソッド source_to_code()を定義します。 デフォルトの実装はcompile(data, path, 'exec', dont_inherit=True)
と同等です。 (:issue: `15627` でEricSnowとBrettCannonによって寄稿されました。)
InspectLoader にも、 get_code()メソッドのデフォルトの実装があります。 ただし、パフォーマンス上の理由から、通常はデフォルトの実装をオーバーライドすることが望ましいでしょう。 (:issue: `18072` のBrettCannonによる寄稿。)
reload()関数は、 imp モジュールの非推奨の一環として、 imp から importlib に移動されました。 (:issue: `18193` のBerkerPeksagによる寄稿。)
importlib.util に MAGIC_NUMBER 属性が追加され、バイトコードのバージョン番号にアクセスできるようになりました。 これは、非推奨の imp モジュールの get_magic()関数を置き換えます。 (:issue: `18192` のBrettCannonによる寄稿。)
新しい importlib.util 関数 cache_from_source()および source_from_cache()は、非推奨の imp モジュールの同じ名前の関数を置き換えます。 (:issue: `18194` のBrettCannonによる寄稿。)
importlib ブートストラップNamespaceLoader
は InspectLoader ABCに準拠するようになりました。つまり、runpy
とpython -m
を名前空間で使用できるようになりました。パッケージ。 (:issue: `18058` のBrettCannonによる寄稿。)
importlib.util には、ユニバーサル改行処理を使用してバイトからソースをデコードする新しい関数 decode_source()があります。 これは、InspectLoader.get_source()
メソッドを実装するのに役立ちます。
importlib.machinery.ExtensionFileLoader に get_filename()メソッドが追加されました。 これは、元の実装では誤って省略されていました。 (:issue: `19152` のEricSnowによる寄稿。)
検査する
inspect モジュールは、モジュール、クラス、および関数のソースコードやその他の情報をすばやく表示するための基本的なコマンドラインインターフェイスを提供するようになりました。 (:issue: `18626` でClaudiuPopaとNickCoghlanによって寄稿されました。)
unwrap()を使用すると、 functools.wraps()(およびラッパー関数に__wrapped__
属性を設定するその他のAPI)によって作成されたラッパー関数チェーンを簡単に解明できます。 。 (:issue: `13266` でDanielUrban、Aaron Iles、Nick Coghlanによって寄稿されました。)
新しい enum モジュールの実装の一部として、 inspect モジュールは、メタクラスを通じて提供されるカスタム__dir__
メソッドと動的クラス属性のサポートを大幅に改善しました。 (:issue: `18929` および:issue:` 19030` でEthanFurmanによって寄稿されました。)
getfullargspec()および getargspec()は、 signature() APIを使用するようになりました。 これにより、__signature__
属性を持つもの、引数クリニックによって提供されるメタデータを持つもの、 functools.partial()オブジェクトなど、はるかに幅広い呼び出し可能オブジェクトをサポートできます。 シグニチャ()とは異なり、これらの関数は__wrapped__
属性を無視し、バインドされたメソッドのバインド済みの最初の引数を報告するため、を使用するようにコードを更新する必要があることに注意してください。 ]これらの機能が必要な場合は、signature()を直接使用します。 (:issue: `17481` でYurySelivanovによって寄稿されました。)
シグニチャ()は、ダックタイプのCPython関数をサポートするようになりました。これにより、Cythonでコンパイルされた関数のサポートが追加されます。 (:issue: `17159` でStefanBehnelとYurySelivanovによって寄稿されました。)
IPアドレス
ipaddress は、暫定API としてPython3.3の標準ライブラリに追加されました。 Python 3.4のリリースにより、この資格は削除されました。 ipaddress は、下位互換性を維持するための通常の標準ライブラリ要件でカバーされる安定したAPIと見なされるようになりました。
アドレスがグローバルにルーティング可能である場合、新しい is_global プロパティはTrue
です。 (:issue: `17400` でPeterMoodyによって寄稿されました。)
ロギング
TimedRotatingFileHandler には、ロールオーバーが発生する時刻を指定するために使用できる新しい atTime パラメーターがあります。 (:issue: `9556` でRonaldOussorenによって寄稿されました。)
SocketHandler および DatagramHandler は、Unixドメインソケットをサポートするようになりました(ポートをNone
に設定することにより)。 (コミットce46195b56a9でVinay Sajipによって寄稿されました。)
fileConfig()は、 fname パラメーターの configparser.RawConfigParser サブクラスインスタンスを受け入れるようになりました。 これにより、ロギング構成がアプリケーション構成全体の一部にすぎない場合、またはアプリケーションが fileConfig()に渡す前に構成を変更する場合に、構成ファイルの使用が容易になります。 (:issue: `16110` のVinaySajipによる寄稿。)
logging.config.listen()関数を介してソケットから受信したロギング構成データは、新しい verify キーワード引数の引数として検証関数を指定することにより、処理前に検証できるようになりました。 。 (:issue: `15452` のVinaySajipによる寄稿。)
元帥
デフォルトの marshal バージョンは3にバンプされました。 新しいバージョンを実装するコードは、インターンされた文字列のコピーを1つだけ記録し、逆シリアル化時にインターンを保持するというPython2の動作を復元し、この「1つのコピー」機能を任意のオブジェクトタイプ(再帰参照の処理を含む)に拡張します。 これにより、.pyc
ファイルのサイズと、モジュールが.pyc
(または.pyo
)ファイルからロードされたときにメモリ内で占有するメモリの量の両方が削減されます。 (:issue: `16475` のKristjánValurJónssonによる寄稿、:issue:` 19219` のAntoinePitrouによる追加のスピードアップ。)
マルチプロセッシング
Unixでは、マルチプロセッシングを使用してプロセスを開始するために、2つの新しい開始メソッド、spawn
およびforkserver
が追加されました。 これらにより、プロセスとスレッドの混合がより堅牢になり、spawn
メソッドは、マルチプロセッシングがWindowsで常に使用してきたセマンティクスと一致します。 新しい関数 get_all_start_methods()は、プラットフォームで使用可能なすべての開始メソッドを報告し、 get_start_method()は現在の開始メソッドを報告し、 set_start_method()は開始メソッドを設定します。 (:issue: `8713` でRichardOudkerkによって寄稿されました。)
マルチプロセッシングには、子プロセスの作成方法を決定するcontext
の概念も含まれるようになりました。 新しい関数 get_context()は、指定されたstartメソッドを使用するコンテキストを返します。 マルチプロセッシングモジュール自体と同じAPIを備えているため、このコンテキスト内で動作する Pool やその他のオブジェクトを作成するために使用できます。 これにより、フレームワークとアプリケーション、または同じアプリケーションの異なる部分が、互いに干渉することなくマルチプロセッシングを使用できるようになります。 (:issue: `18999` でRichardOudkerkによって寄稿されました。)
古い fork startメソッドを使用する場合を除いて、子プロセスは親から不要なハンドル/ファイル記述子を継承しなくなりました(:issue: `8713` の一部)。
マルチプロセッシングは runpy (-m
スイッチを実装)に依存して、spawn
を使用するときに子プロセスで__main__
を適切に初期化します。またはforkserver
startメソッド。 これにより、マルチプロセッシング、-m
コマンドラインスイッチ、および明示的な相対インポートを組み合わせると、子プロセスで不明瞭な障害が発生する可能性があるいくつかのエッジケースが解決されます。 (:issue: `19946` でNickCoghlanによって寄稿されました。)
オペレーター
新しい関数 length_hint()は、 PEP 424の一部として、 __ length_hint __()特殊メソッドの使用方法に関する仕様の実装を提供します。 この言語機能の正式な仕様。 (:issue: `16148` でArminRonacherによって寄稿されました。)
operator モジュールの純粋なPythonバージョンが参照可能になり、Pythonの代替実装で使用できるようになりました。 (:issue: `16694` のZacharyWareによる寄稿。)
os
ファイル記述子( os.get_inheritable()、 os.set_inheritable())またはWindowsハンドルの継承可能フラグを取得および設定するための新しい関数があります( os.get_handle_inheritable()、 os.set_handle_inheritable())。
新しい関数 cpu_count()は、Pythonが実行されているプラットフォームで使用可能なCPUの数を報告します(カウントが決定できない場合はNone
)。 multiprocessing.cpu_count()関数は、この関数の観点から実装されています)。 (:issue: `17914` で、Trent Nelson、Yogesh Chaudhari、Victor Stinner、Charles-FrançoisNataliによって寄稿されました。)
os.path.samestat()がWindowsプラットフォームで利用できるようになりました( os.path.samefile()の実装がUnixとWindowsで共有されるようになりました)。 (:issue: `11939` でBrianCurtinによって寄稿されました。)
os.path.ismount()は、Windowsのドライブルートの下にマウントされたボリュームを認識するようになりました。 (:issue: `9035` でTimGoldenによって寄稿されました。)
os.open()は、それらを提供するプラットフォームで2つの新しいフラグをサポートします。 O_PATH (開かれていないファイル記述子)と O_TMPFILE (名前のない一時ファイル。 3.4.0リリースのバージョンは、カーネルバージョンが3.11以降でuapiヘッダーを持つLinuxシステムでのみ使用できます。 (:issue: `18673` とBenjaminPetersonでそれぞれChristianHeimesによって寄稿されました。)
pdb
pdb は、ジェネレーター、 yield 、およびyield from
をより便利な方法で処理するように拡張されました。 これは、 asyncio ベースのプログラムをデバッグするときに特に役立ちます。 (:issue: `16596` でAndrewSvetlovとXavierde Gayeによって寄稿されました。)
print
コマンドが pdb から削除され、pdbコマンドラインからPython print()関数へのアクセスが復元されました。 Python2のpdb
にはprint
コマンドがありませんでした。 代わりに、print
と入力すると、print
ステートメントが実行されました。 Python3では、print
が誤ってpdb :pdbcmd: `p` コマンドのエイリアスになりました。 ただし、p
は、Python2 print
コマンドのようにstr
ではなく引数のrepr
を出力します。 さらに悪いことに、Python3 pdb print
コマンドはPython3 print
関数をシャドウイングし、pdb
プロンプトでアクセスできなくなりました。 (:issue: `18764` でConnorOsbornによって寄稿されました。)
きゅうりのピクルス
pickle は、新しいpickleプロトコルであるプロトコル4をサポートするようになりました(ただし、デフォルトでは使用されません)。 この新しいプロトコルは、ネストされたクラス、非常に大きな文字列とコンテナ、__new__()
メソッドがキーワードのみの引数を取るクラスなど、以前のプロトコルに存在していた多くの問題に対処します。 また、いくつかの効率の改善を提供します。
plistlib
plistlib には、stdlibシリアル化プロトコルの標準パターンと同様のAPIがあり、新しい load()、 dump()、 load( )、および dumps()関数。 (古いAPIは非推奨になりました。)すでにサポートされているXML plist形式( FMT_XML )に加えて、バイナリplist形式( FMT_BINARY )もサポートするようになりました。 (:issue: `14455` でRonaldOussorenらによって寄稿されました。)
poplib
poplib に2つの新しいメソッドが追加されました。POPサーバーによってアドバタイズされた機能のリストを返す capa()と、切り替える stls()です。 POPサーバーがサポートしている場合は、クリアテキストのPOP3セッションを暗号化されたPOP3セッションに変換します。 (:issue: `4473` でLorenzoCatucciによって寄稿されました。)
pprint
pprint モジュールの PrettyPrinter クラスとその pformat()、および pprint()関数に新しいオプション complex [ X148X]、出力のフォーマット方法を制御します。 現在 compact をTrue
に設定しているということは、各(インデントされた)行の width 内に収まる数のシーケンス要素でシーケンスが印刷されることを意味します。 (:issue: `19132` でSerhiyStorchakaによって寄稿されました。)
長い文字列は、Pythonの通常の行継続構文を使用してラップされるようになりました。 (:issue: `17150` のAntoinePitrouによる寄稿。)
pydoc
pydoc モジュールは inspect.signature()イントロスペクションAPIに直接基づいており、さまざまな呼び出し可能オブジェクトの署名情報を提供できるようになりました。 この変更は、ヘルプ情報を表示するときに__wrapped__
属性が考慮されるようになったことも意味します。 (:issue: `19674` のLarryHastingsによる寄稿。)
pydoc モジュールは、すでにバインドされているメソッドのself
パラメーターを表示しなくなりました。 代わりに、提供された呼び出し可能オブジェクトの正確な現在の署名を常に表示することを目的としています。 (:issue: `20710` のLarryHastingsによる寄稿。)
pydoc に直接加えられた変更に加えて、カスタム__dir__
メソッドの処理とさまざまな記述子の動作も、 inspect [の根本的な変更によって大幅に改善されました。 X231X]モジュール。
help()ビルトインは pydoc に基づいているため、上記の変更は help()の動作にも影響します。
NS
新しい fullmatch()関数とregex.fullmatch()
メソッドは、文字列の両端でパターンを固定して一致させます。 これにより、一致の目的を明確にする方法が提供され、コードの変更または既存の正規表現への代替の追加中に$
文字が失われるという微妙なバグのクラスが回避されます。 (:issue: `16203` のMatthewBarnettによる寄稿。)
正規表現オブジェクトのreprに、パターンとフラグが含まれるようになりました。 一致オブジェクトのreprには、開始、終了、および一致した文字列の部分が含まれるようになりました。 (:issue: `13592` および:issue:` 17087` でHugoLopesTavaresおよびSerhiyStorchakaによって寄稿されました。)
資源
新しい prlimit()関数は、カーネルバージョン2.6.36以降およびglibc 2.13以降のLinuxプラットフォームで使用可能であり、作成中のプロセス以外のプロセスのリソース制限を照会または設定する機能を提供します。呼び出し。 (:issue: `16595` でChristianHeimesによって寄稿されました。)
Linuxカーネルバージョン2.6.36以降では、いくつかの新しいLinux固有の定数もあります: RLIMIT_MSGQUEUE 、 RLIMIT_NICE 、 RLIMIT_RTPRIO 、 RLIMIT_RTTIME 、および RLIMIT_SIGPENDING 。 (:issue: `19324` でChristianHeimesによって寄稿されました。)
FreeBSDバージョン9以降では、いくつかの新しいFreeBSD固有の定数 RLIMIT_SBSIZE 、 RLIMIT_SWAP 、および RLIMIT_NPTS があります。 (:issue: `19343` でClaudiuPopaによって寄稿されました。)
選択する
epoll オブジェクトがコンテキスト管理プロトコルをサポートするようになりました。 with ステートメントで使用すると、 close()メソッドがブロックの最後で自動的に呼び出されます。 (:issue: `16488` でSerhiyStorchakaによって寄稿されました。)
devpoll オブジェクトには、 fileno()メソッドと close()メソッド、および新しい属性 closed が含まれるようになりました。 (:issue: `18794` でVictorStinnerによって寄稿されました。)
棚
Shelf インスタンスは、 with ステートメントで使用できるようになり、with
ブロックの最後で自動的に閉じられます。 (:issue: `13896` のFilipGruszczyńskiによる寄稿。)
シャティル
copyfile()は、ソースと宛先が同じファイルである場合に、特定の Error サブクラス SameFileError を発生させるようになりました。これにより、アプリケーションはこれに対して適切なアクションを実行できます。特定のエラー。 (:issue: `1492704` で石本敦夫とHynekSchlawackによって寄稿されました。)
smtpd
SMTPServer クラスと SMTPChannel クラスは、 map キーワード引数を受け入れるようになりました。この引数は、指定されている場合、 asynchat.async_chat にとして渡されます。 X173X] map 引数。 これにより、アプリケーションはグローバルソケットマップへの影響を回避できます。 (:issue: `11959` でVinaySajipによって寄稿されました。)
smtplib
SMTPException は OSError のサブクラスになりました。これにより、ソケットレベルのエラーとSMTPプロトコルレベルのエラーの両方を、エラーかどうかだけを気にするコードによって1つのtry / exceptステートメントでキャッチできます。発生した。 (:issue: `2118` でNedJackson Lovelyによって寄稿されました。)
ソケット
ソケットモジュールは、それをサポートするプラットフォームで CAN_BCM プロトコルをサポートするようになりました。 (:issue: `15359` でBrianThorneによって寄稿されました。)
ソケットオブジェクトには、継承可能フラグ、 get_inheritable()、および set_inheritable()を取得または設定するための新しいメソッドがあります。
socket.AF_*
およびsocket.SOCK_*
定数は、新しい enum モジュールを使用した列挙値になりました。 これにより、整数の「マジックナンバー」の代わりに、意味のある名前をデバッグ中に出力できます。
AF_LINK 定数がBSDおよびOSXで利用できるようになりました。
inet_pton()および inet_ntop()がWindowsでサポートされるようになりました。 (:issue: `7171` で石本敦夫によって寄稿されました。)
sqlite3
connect()関数の新しいブールパラメータ uri を使用して、 database パラメータがuri
であることを示すことができます(を参照)。 SQLite URIドキュメント)。 (:issue: `13773` のpoqによって寄稿されました。)
ssl
PROTOCOL_TLSv1_1 および PROTOCOL_TLSv1_2 (TLSv1.1およびTLSv1.2サポート)が追加されました。 これらのプロトコルのサポートは、PythonがOpenSSL1.0.1以降とリンクされている場合にのみ利用できます。 (:issue: `16692` でMicheleOrrùとAntoinePitrouによって寄稿されました。)
新しい関数 create_default_context()は、互換性とセキュリティの適切なバランスをとることを目的とした設定の SSLContext を取得するための標準的な方法を提供します。 これらの設定は、 SSLContext コンストラクターによって提供されるデフォルトよりも厳格であり、ベストプラクティスのセキュリティ要件が変更された場合、事前の非推奨なしに将来調整される可能性があります。 SSLをサポートするstdlibライブラリを使用するための新しい推奨ベストプラクティスは、 create_default_context()を使用して SSLContext オブジェクトを取得し、必要に応じて変更してから、として渡すことです。適切なstdlibAPIのcontext 引数。 (:issue: `19689` でChristianHeimesによって寄稿されました。)
SSLContext メソッド load_verify_locations()は、新しいオプションの引数 cadata を受け入れます。これを使用して、PEMまたはDERでエンコードされた証明書をそれぞれ文字列またはバイトで直接提供できます。 (:issue: `18138` でChristianHeimesによって寄稿されました。)
新しい関数 get_default_verify_paths()は、 set_default_verify_paths()メソッドがOpenSSLのデフォルトのcafile
およびcapath
を設定するために使用するパスと環境変数の名前付きタプルを返します]。 これは、デフォルトの検証の問題をデバッグするのに役立ちます。 (:issue: `18143` でChristianHeimesによって寄稿されました。)
SSLContext には、ロードされたX.509
証明書、X.509 CA
証明書、および証明書失効リスト([ X169X] s)、およびロードされたCA
証明書のリストを返す get_ca_certs()メソッド。 (:issue: `18147` でChristianHeimesによって寄稿されました。)
OpenSSL 0.9.8以降が使用可能な場合、 SSLContext には新しい属性 verify_flags があり、新しい定数の組み合わせに設定することで、証明書検証プロセスを制御できます。 ] VERIFY_DEFAULT 、 VERIFY_CRL_CHECK_LEAF 、 VERIFY_CRL_CHECK_CHAIN 、または VERIFY_X509_STRICT 。 OpenSSLは、デフォルトではCRL検証を行いません。 (:issue: `8813` でChristienHeimesによって寄稿されました。)
新しい SSLContext メソッド load_default_certs()は、プラットフォームによって異なるデフォルトの場所から一連のデフォルトの「認証局」(CA)証明書をロードします。 これは、クライアントがサーバーの検証に使用するTLS Webサーバー認証証明書(purpose=
SERVER_AUTH )と、サーバーがクライアント証明書の検証に使用する証明書([ X214X] CLIENT_AUTH )。 (:issue: `19292` でChristianHeimesによって寄稿されました。)
2つの新しいWindows専用関数 enum_certificates()と enum_crls()は、Windows証明書ストアから証明書、証明書情報、およびCRLを取得する機能を提供します。 (:issue: `17134` でChristianHeimesによって寄稿されました。)
新しい ssl.SSLContext.set_servername_callback()メソッドを使用したサーバー側SNI(サーバー名表示)のサポート。 (:issue: `8109` でDanielBlackによって寄稿されました。)
SSLSocket.getpeercert()によって返されるディクショナリには、追加のX509v3
拡張アイテム(crlDistributionPoints
、calIssuers
、およびOCSP
URI)が含まれています。 (:issue: `18379` でChristianHeimesによって寄稿されました。)
統計
stat モジュールは、_stat
のC実装によってサポートされるようになりました。 ほとんどの値は標準化されておらず、プラットフォームに依存するため、AC実装が必要です。 (:issue: `11016` でChristianHeimesによって寄稿されました。)
このモジュールは、新しい ST_MODE フラグ、 S_IFDOOR 、 S_IFPORT 、および S_IFWHT をサポートします。 (:issue: `11016` でChristianHiemesによって寄稿されました。)
構造体
コンパイルされた形式の新しい関数 iter_unpack と新しい struct.Struct.iter_unpack()メソッドは、特定の形式のデータの繰り返しインスタンスを含むバッファーのストリーミングアンパックを提供します。 (:issue: `17804` のAntoinePitrouによる寄稿。)
サブプロセス
check_output()は、実行されるコマンドのstdin
の内容を提供するために使用できる input 引数を受け入れるようになりました。 (:issue: `16624` でZackWeinbergによって寄稿されました。)
getstatus()
および getstatusoutput()がWindowsで機能するようになりました。 この変更は、実際には3.3.4で誤って行われたものです。 (:issue: `10197` でTimGoldenによって寄稿されました。)
スナウ
getparams()
メソッドは、プレーンタプルではなく名前付きタプルを返すようになりました。 (:issue: `18901` のClaudiuPopaによる寄稿。)
sunau.open()がコンテキスト管理プロトコルをサポートするようになりました。 with ブロックで使用すると、返されたオブジェクトのclose
メソッドが最後に自動的に呼び出されます。ブロックの。 (:issue: `18878` でSerhiyStorchakaによって寄稿されました。)
AU_write.setsampwidth()は24ビットサンプルをサポートするようになり、モジュールを使用して24サンプルを書き込むためのサポートが追加されました。 (:issue: `19261` でSerhiyStorchakaによって寄稿されました。)
writeframesraw()および writeframes()メソッドは、バイトのようなオブジェクトを受け入れるようになりました。 (:issue: `8311` のSerhiyStorchakaによる寄稿。)
sys
新しい関数 sys.getallocatedblocks()は、インタープリターによって割り当てられた現在のブロック数を返します。 (デフォルトの--with-pymalloc
設定のCPythonでは、これは PyObject_Malloc() APIを介して行われる割り当てです。)これは、特にテストスイートを介して自動化されている場合、メモリリークの追跡に役立ちます。 (:issue: `13390` のAntoinePitrouによる寄稿。)
Pythonインタープリターがインタラクティブモードで起動すると、 sys モジュールの __ Interactivehook __ 属性をチェックします。 属性が存在する場合、その値は、対話モードが開始される直前に引数なしで呼び出されます。 PYTHONSTARTUP ファイルが読み取られた後にチェックが行われるため、そこで設定できます。 site モジュールは、プラットフォームが readline をサポートしている場合に、タブ補完と履歴保存(~/.python-history
内)を可能にする関数に設定します。 この(新しい)動作が必要ない場合は、 PYTHONSTARTUP 、sitecustomize
、またはusercustomize
でこの属性を[から削除することにより、オーバーライドできます。 X158X] sys (または他の呼び出し可能に設定)。 (:issue: `5845` でÉricAraujoとAntoinePitrouによって寄稿されました。)
tarfile
tarfile モジュールは、スクリプトとして直接または-m
を介して呼び出されたときに、単純なコマンドラインインターフェイスをサポートするようになりました。 これは、tarfileアーカイブを作成および抽出するために使用できます。 (:issue: `13477` のBerkerPeksagによる寄稿。)
テキストの折り返し
TextWrapper クラスには、2つの新しい属性/コンストラクター引数があります。出力の行数を制限する max_lines と、出力の行数を制限する placeholder です。 max_lines のために切り捨てられた場合、出力の最後に表示されます。 これらの機能に基づいて、新しい便利な関数 shorten()は、入力内のすべての空白を単一のスペースに折りたたんで、で終わる特定の幅の単一行を生成します。 ]プレースホルダー(デフォルトでは[...]
)。 (:issue: `18585` および:issue:` 18725` でAntoinePitrouおよびSerhiyStorchakaによって寄稿されました。)
糸脱毛
メインスレッドを表す Thread オブジェクトは、新しい main_thread()関数から取得できます。 通常の状態では、これはPythonインタープリターが開始されたスレッドになります。 (:issue: `18882` でAndrewSvetlovによって寄稿されました。)
トレースバック
新しい traceback.clear_frames()関数は、トレースバックオブジェクトを受け取り、それが参照するすべてのフレームのローカル変数をクリアして、消費されるメモリの量を削減します。 (:issue: `1565525` でAndrewKuchlingによって寄稿されました。)
種類
新しい DynamicClassAttribute()記述子は、インスタンスオブジェクトを検索したときに正常に機能するが、クラス __getattr__
にルーティングされる属性を定義する方法を提供します。クラスを通して見上げた。 これにより、クラスでアクティブなプロパティを持ち、同じ名前のクラスで仮想属性を持つことができます(例についてはEnum
を参照)。 (:issue: `19030` でEthanFurmanによって寄稿されました。)
urllib
urllib.request は、 DataHandler クラスを介してdata:
URLをサポートするようになりました。 (:issue: `16423` のMathiasPanzenböckによる寄稿。)
Request クラスで使用されるhttpメソッドは、サブクラスに method クラス属性を設定することで指定できるようになりました。 (:issue: `18978` のJasonR Coombsによる寄稿。)
Request オブジェクトが再利用可能になりました。 full_url または data 属性が変更されると、関連するすべての内部プロパティが更新されます。 これは、たとえば、同じ Request オブジェクトを複数の OpenerDirector.open()呼び出しで、異なる data 引数を使用して使用できるようになったことを意味します。または、 Request のurl
を最初から再計算するのではなく、変更します。 Request からヘッダーを削除するために使用できる新しい remove_header()メソッドもあります。 (:issue: `16464` のAlexeyKachayev、:issue:` 17485` のDanielWozniak、:issue: `17272のDamienBrechtとSenthilKumaranによる寄稿`。)
HTTPError オブジェクトに、エラーに関連付けられたHTTP応答ヘッダーへのアクセスを提供する headers 属性が追加されました。 (:issue: `15701` のBerkerPeksagによる寄稿。)
単体テスト
TestCase クラスには新しいメソッド subTest()があり、 with ブロックが「サブテスト」になるコンテキストマネージャーを生成します。 このコンテキストマネージャーを使用すると、たとえば、ループ内でsubTest
コンテキストマネージャーを呼び出すことにより、テストメソッドでサブテストを動的に生成できます。 これにより、単一のテスト方法で、個別に識別され、個別にカウントされたテストを無数に生成できます。これらのテストは、1つ以上が失敗した場合でも実行されます。 例えば:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
結果として6つのサブテストが生成され、それぞれが単体テストの詳細出力で、変数名i
とその変数の特定の値(i=0
、i=1
など)で構成されるラベルで識別されます。 )。 この例の完全版については、サブテストを使用したテスト反復の識別を参照してください。 (:issue: `16997` のAntoinePitrouによる寄稿。)
unittest.main()は、 defaultTest の反復可能なテスト名を受け入れるようになりました。以前は、文字列として1つのテスト名しか受け入れていませんでした。 (:issue: `15132` でJyrkiPulliainenによって寄稿されました。)
テスト検出中に SkipTest が発生した場合(つまり、テストファイルのモジュールレベルで)、エラーではなくスキップとして報告されるようになりました。 (:issue: `16935` でZachWareによって寄稿されました。)
Discover()は、検出されたファイルを並べ替えて、一貫したテスト順序を提供するようになりました。 (:issue: `16709` でMartinMelinとJeffRamnaniによって寄稿されました。)
TestSuite は、テストが成功した場合、テストが実行されるとすぐにテストへの参照をドロップするようになりました。 ガベージコレクションを行うPythonインタープリターでは、これにより、テストへの参照を保持しているものが他にない場合に、テストをガベージコレクションすることができます。 カスタム_removeTestAtIndex
メソッドを定義する TestSuite サブクラスを作成することにより、この動作をオーバーライドすることができます。 (:issue: `11798` でTomWardill、Matt McClure、Andrew Svetlovによって寄稿されました。)
新しいテストアサーションコンテキストマネージャー assertLogs()は、特定のコードブロックが logging モジュールを使用してログメッセージを出力することを保証します。 デフォルトでは、メッセージは任意のロガーから送信され、INFO
以上の優先度を持つことができますが、ロガー名と代替の最小ログレベルの両方を指定できます。 コンテキストマネージャによって返されるオブジェクトは、ログに記録された LogRecord および/またはフォーマットされたメッセージについてクエリできます。 (:issue: `18937` のAntoinePitrouによる寄稿。)
テスト検出が名前空間パッケージで機能するようになりました(:issue: `17457` のClaudiuPopaによる寄稿)。
unittest.mock オブジェクトは、呼び出しを照合するときに仕様シグネチャを検査するようになりました。つまり、引数は、位置だけでなく、位置または名前のいずれかで照合できるようになりました。 (:issue: `17015` のAntoinePitrouによる寄稿。)
mock_open()
オブジェクトにreadline
メソッドとreadlines
メソッドが追加されました。 (:issue: `17467` の倉富敏夫による寄稿。)
venv
venv には、csh
およびfish
シェルのアクティベーションスクリプトが含まれるようになりました。 (:issue: `15417` でAndrewSvetlovによって寄稿されました。)
EnvBuilder と create()コンビニエンス関数は、新しいキーワード引数 with_pip を取ります。これは、デフォルトでFalse
になり、[X172X ] EnvBuilder は、pip
が仮想環境にインストールされていることを確認します。 ( PEP 453 実装の一部として:issue: `19552` でNickCoghlanによって寄稿されました。)
波
getparams()
メソッドは、プレーンタプルではなく名前付きタプルを返すようになりました。 (:issue: `17487` でClaudiuPopaによって寄稿されました。)
wave.open()がコンテキスト管理プロトコルをサポートするようになりました。 (:issue: `17616` のClaudiuPopaによる寄稿。)
wave は、シークできないファイルに出力を書き込むことができるようになりました。 (:issue: `5202` のDavidJones、Guilherme Polo、およびSerhiy Storchakaによる寄稿。)
writeframesraw()および writeframes()メソッドは、バイトのようなオブジェクトを受け入れるようになりました。 (:issue: `8311` のSerhiyStorchakaによる寄稿。)
weakref
新しい WeakMethod クラスは、バインドされたメソッドへの弱い参照をシミュレートします。 (:issue: `14631` のAntoinePitrouによる寄稿。)
新しい finalize クラスを使用すると、弱参照自体のライフサイクルを注意深く管理しなくても、オブジェクトがガベージコレクションされたときに呼び出されるコールバックを登録できます。 (:issue: `15528` でRichardOudkerkによって寄稿されました。)
ref に関連付けられているコールバックがある場合は、 __ callback __ 属性を介して公開されるようになりました。 (:issue: `17643` でMarkDickinsonによって寄稿されました。)
xml.etree
新しいパーサー XMLPullParser を使用すると、非ブロッキングアプリケーションでXMLドキュメントを解析できます。 例は、非ブロッキング解析用のプルAPI で見ることができます。 (:issue: `17741` のAntoinePitrouによる寄稿。)
xml.etree.ElementTree tostring()および tostringlist()関数、および ElementTree write()[X134X ]メソッドに、 short_empty_elements キーワードのみのパラメーターが追加され、コンテンツのない要素を省略形(<tag />
)または展開形( [ X333X])フォーム。 (:issue: `14377` でArielPoliakとSerhiyStorchakaによって寄稿されました。)
ZIPファイル
PyZipFile クラスの writepy()メソッドには、アーカイブに追加するディレクトリとファイルを制御するために使用できる新しい filterfunc オプションがあります。 たとえば、これを使用して、アーカイブからテストファイルを除外できます。 (:issue: `19274` でChristianTismerによって寄稿されました。)
ZipFile およびPyZipfile
の allowZip64 パラメーターは、デフォルトでTrue
になりました。 (:issue: `17201` でWilliamMallardによって寄稿されました。)
CPython実装の変更
PEP 442:安全なオブジェクトのファイナライズ
PEP 442 は、CPythonでのオブジェクトファイナライズの現在の制限と癖を取り除きます。 これにより、__del__()
メソッドを持つオブジェクト、および finally 句を持つジェネレーターは、参照サイクルの一部であるときにファイナライズできます。
この変更の一環として、ほとんどの場合、インタープリターのシャットダウン中にモジュールグローバルが None に強制的に設定されることはなくなり、代わりにサイクリックガベージコレクターの通常の操作に依存します。 これにより、サイクリックGCが最初に導入されて以来Pythonを悩ませてきた、通常は__del__
メソッドに関連する、クラス全体のインタープリターシャットダウン時間エラーが回避されます。
PEP 456:安全で交換可能なハッシュアルゴリズム
PEP 456 は、Pythonのハッシュアルゴリズムで行われた以前のセキュリティ修正作業をフォローアップして、辞書ルックアップに裏打ちされた公開APIが対象となる可能性のある特定のDOS攻撃に対処します。 (現在の改善ラウンドの開始については、:issue: `14621` を参照してください。)PEPは、CPythonのハッシュコードを統合して、パッケージャーが別のハッシュアルゴリズムを簡単に置き換えられるようにし、Pythonのデフォルトの実装を切り替えます。 64ビットのデータ型を持つプラットフォームでのSipHash実装に。 古いFNVアルゴリズムと比較したパフォーマンスの違いはごくわずかです。
PEPは、 sys.hash_info という名前のタプルにフィールドを追加して、現在実行中のバイナリで使用されているハッシュアルゴリズムを記述します。 それ以外の場合、PEPは既存のCPythonAPIを変更しません。
PEP 436:引数クリニック
「引数クリニック」( PEP 436 )はCPythonビルドプロセスの一部になり、実装されたビルトインおよび標準ライブラリ拡張モジュールの正確な署名を定義および維持するプロセスを簡素化するために使用できます。 Cで。
一部の標準ライブラリ拡張モジュールは、Python 3.4で引数クリニックを使用するように変換され、それに応じて pydoc および inspect が更新されました。
プログラムによるイントロスペクションの署名メタデータは、Python3.4メンテナンスリリースの一部としてCに実装された追加の呼び出し可能オブジェクトに追加されることが期待されています。
ノート
Argument Clinic PEPは、実装の状態について完全に最新ではありません。 この場合、引数クリニックはPython 3.4でサードパーティが使用するパブリックAPIとして利用できないため、これはリリースマネージャーとコア開発チームによって受け入れられると見なされています。
その他のビルドおよびCAPIの変更
- 新しい PyType_GetSlot()関数が安定したABIに追加され、制限付きAPIを使用するときに名前付きタイプスロットから関数ポインターを取得できるようになりました。 (:issue: `17162` でMartinvonLöwisによって寄稿されました。)
- 新しい Py_SetStandardStreamEncoding()事前初期化APIを使用すると、CPythonインタープリターを組み込んだアプリケーションで、標準ストリームの特定のエンコーディングとエラーハンドラーを確実に強制できます。 (:issue: `16129` でBastienMontagneとNickCoghlanによって寄稿されました。)
- 文字列引数を変更しないほとんどのPythonC APIは、
char *
ではなくconst char *
を受け入れるものとして正しくマークされるようになりました。 (:issue: `1772673` でSerhiyStorchakaによって寄稿されました。) python-config
の新しいシェルバージョンは、Pythonインタープリターが利用できない場合でも使用できます(クロスコンパイルシナリオなど)。- PyUnicode_FromFormat()は、
%s
、%A
、%U
、%V
、%S
の幅と精度の仕様をサポートするようになりました。 、および%R
。 (:issue: `7330` でYsjRayとVictorStinnerによって寄稿されました。) - 新しい関数 PyStructSequence_InitType2()は、既存の PyStructSequence_InitType()関数を補完します。 違いは、成功すると
0
を返し、失敗すると-1
を返すことです。 - CPythonソースは、最近のバージョンのGCCおよびclangのアドレス健全性チェック機能を使用してコンパイルできるようになりました。スモールオブジェクトアロケーターの誤警報は抑制されました。 (:issue: `18596` でDhiruKholiaによって寄稿されました。)
- Windowsビルドでは、アドレス空間配置のランダム化およびデータ実行防止が使用されるようになりました。 (:issue: `16632` のChristianHeimesによる寄稿。)
- 新しい関数
PyObject_LengthHint()
は、 operator.length_hint()と同等のCAPIです。 (:issue: `16148` でArminRonacherによって寄稿されました。)
その他の改善
- python コマンドには、新しいオプション、
-I
があり、「分離モード」で実行されます。つまり、 sys.path スクリプトのディレクトリもユーザーのsite-packages
ディレクトリも含まれず、すべてのPYTHON*
環境変数は無視されます(-s
と [X316Xの両方を意味します) ])。 スクリプトの実行をユーザーの環境から分離することを目的として、他の制限も将来適用される可能性があります。 これは、たとえば、Pythonを使用してシステムスクリプトを実行する場合に適しています。 ほとんどのPOSIXシステムでは、システムスクリプトの#!
行で使用でき、使用する必要があります。 (:issue: `16499` でChristianHeimesによって寄稿されました。) - readline をサポートするシステムの対話型インタープリターで、タブ補完がデフォルトで有効になりました。 履歴もデフォルトで有効になっており、ファイル
~/.python-history
に書き込まれます(そしてファイルから読み取られます)。 (:issue: `5845` でAntoinePitrouとÉricAraujoによって寄稿されました。) --version
を使用してPythonインタープリターを呼び出すと、バージョンが標準エラーではなく標準出力に出力されるようになりました(:issue: `18338` )。 argparse (:issue: `18920` )およびスクリプトのような呼び出し機能を持つ他のモジュール(:issue:` 18922` )にも同様の変更が加えられました。 。- CPython Windowsインストーラーは、拡張機能の登録時に
.py
をPATHEXT
変数に追加するようになりました。これにより、ユーザーは名前を入力せずにWindowsコマンドプロンプトでPythonスクリプトを実行できます。.py
拡張機能。 (:issue: `18569` でPaulMooreによって寄稿されました。) - 新しい
make
ターゲット coverage-report は、Pythonをビルドし、テストスイートを実行し、gcov
と lcov [を使用してCコードベースのHTMLカバレッジレポートを生成します。 X171X]。 - python回帰テストスイートの
-R
オプションは、 sys.getallocatedblocks()を使用して、メモリ割り当てリークもチェックするようになりました。 (:issue: `13390` のAntoinePitrouによる寄稿。) python -m
が名前空間パッケージで機能するようになりました。- stat モジュールがCで実装されるようになりました。つまり、以前のようにPythonモジュールに値をハードコーディングする代わりに、Cヘッダーファイルから定数の値を取得します。
- 単一のOSモジュール(
.so
、.dll
)から複数のPythonモジュールをロードすることが正しく機能するようになりました(以前は、ファイル内の最初のPythonモジュールをサイレントに返していました)。 (:issue: `16421` でVáclavŠmilauerによって寄稿されました。) - 新しいオペコード:opcode: `LOAD_CLASSDEREF` が追加され、 __ prepare __ の特定の使用によってトリガーされる可能性のあるクラス本体の自由変数のロードのバグが修正されました。 (:issue: `17853` でBenjaminPetersonによって寄稿されました。)
- 多くのMemoryError関連のクラッシュは、VictorStinnerが PEP 445 ベースの
pyfailmalloc
ツール(:issue: `18408` [ X160X]、:issue: `18520` )。 pyvenv
コマンドは、シンボリックリンクがデフォルトであるシステムでも、シンボリックリンクではなくコピーを使用する--copies
オプションを受け入れるようになりました。 (:issue: `18807` でVinaySajipによって寄稿されました。)pyvenv
コマンドは、--without-pip
オプションも受け入れて、仮想環境へのpipの自動ブートストラップを抑制します。 ( PEP 453 実装の一部として:issue: `19552` でNickCoghlanによって寄稿されました。)- PYTHONIOENCODING 環境変数に設定された値で、エンコード名がオプションになりました。 これにより、デフォルトのエンコーディングを変更せずに、エラーハンドラのみを設定できます。 (:issue: `18818` のSerhiyStorchakaによる寄稿。)
- bz2 、 lzma 、および gzip モジュール
open
関数は、x
(排他的作成)モードをサポートするようになりました。 (:issue: `19201` 、:issue:` 19222` 、および:issue: `19223` でTimHeaneyとVajraskyKokによって寄稿されました。)
重要な最適化
- UTF-32デコーダーは3倍から4倍高速になりました。 (:issue: `14625` のSerhiyStorchakaによる寄稿。)
- セットのハッシュ衝突のコストが削減されました。 各ハッシュテーブルプローブは、ハッシュテーブルを介してランダムプローブを作成し続ける前に、一連の連続する隣接するキー/ハッシュペアをチェックするようになりました。 これは、キャッシュの局所性を利用して、衝突解決のコストを削減します。 衝突解決スキームは、線形プロービングとオープンアドレス法のハイブリッドとして説明できます。 追加の線形プローブの数はデフォルトで9になります。 これは、LINEAR_PROBESを任意の値に定義することにより、コンパイル時に変更できます。 LINEAR_PROBES = 0を設定して、線形プロービングを完全にオフにします。 (:issue: `18771` でRaymondHettingerによって寄稿されました。)
- 通訳は約30 % f asterから始まります。 いくつかの対策がスピードアップにつながります。 インタープリターは、起動時にロードするモジュールの数を減らします。 re 、 collections 、 locale モジュールとそれらの依存関係は、デフォルトでインポートされなくなりました。 マーシャルモジュールは、コンパイルされたPythonコードをより高速にロードするように改善されました。 (:issue: `19219` 、:issue:` 19218` 、:issue: `19209` のAntoinePitrou、Christian Heimes、VictorStinnerによる寄稿、:issue: `19205` および:issue:` 9548` 。)
- bz2.BZ2File は、ほとんどの場合、Python2バージョンと同じかそれよりも高速になりました。 lzma.LZMAFile も最適化されています。 (:issue: `16034` でSerhiyStorchakaとNadeemVawdaによって寄稿されました。)
- random.getrandbits()は、小さい整数の場合(最も一般的な使用例)、20 %-40%高速です。 (:issue: `16674` のSerhiyStorchakaによる寄稿。)
- 文字列の新しいストレージ形式を利用することで、文字列の酸洗いが大幅に高速化されました。 (:issue: `15596` のVictorStinnerとAntoinePitrouによる寄稿。)
io.FileIO.readall()
のパフォーマンスの問題が解決されました。 これは特にWindowsに影響し、サブプロセスを介して大量のデータをパイプする場合を大幅に高速化します。 (:issue: `15758` でRichardOudkerkによって寄稿されました。)- html.escape()が10倍高速になりました。 (:issue: `18020` でMattBryantによって寄稿されました。)
- Windowsでは、
obmalloc
のCRTmalloc
の代わりにネイティブVirtualAlloc
が使用されるようになりました。 人工ベンチマークは、約3%のメモリ節約を示しています。 - os.urandom()は、複数のスレッドから並行して実行されるときに多くのファイル記述子を使用しないように、遅延して開かれた永続ファイル記述子を使用するようになりました。 (:issue: `18756` のAntoinePitrouによる寄稿。)
非推奨
このセクションでは、Python 3.4で非推奨になり、Python3.5以降で削除されるさまざまなAPIやその他の機能について説明します。 ほとんどの場合(すべてではありません)、非推奨のAPIを使用すると、非推奨の警告を有効にして(たとえば、-Wd
を使用して)インタープリターを実行すると、 DeprecationWarning が生成されます。
PythonAPIの非推奨
- PEP 451:インポートシステムのModuleSpecタイプで説明されているように、多くの importlib メソッドと関数は非推奨になりました。 importlib.find_loader()は次のように置き換えられました。 importlib.util.find_spec(); importlib.machinery.PathFinder.find_module()は importlib.machinery.PathFinder.find_spec()に置き換えられました。 importlib.abc.MetaPathFinder.find_module()は importlib.abc.MetaPathFinder.find_spec()に置き換えられました。 importlib.abc.PathEntryFinder.find_loader()および find_module()は importlib.abc.PathEntryFinder.find_spec()に置き換えられました。 すべての
xxxLoader
ABCload_module
メソッド( importlib.abc.Loader.load_module()、 importlib.abc.InspectLoader.load_module()、 importlib.abc.FileLoader.load_module()、 importlib.abc.SourceLoader.load_module())は実装されなくなり、代わりにローダーはexec_module
メソッドを実装する必要があります。 ( importlib.abc.Loader.exec_module()、 importlib.abc.InspectLoader.exec_module() importlib.abc.SourceLoader.exec_module())残りはインポートシステムが処理します。 および importlib.abc.Loader.module_repr()、 importlib.util.module_for_loader()、 importlib.util.set_loader()、および importlib .util.set_package()は、それらの関数がインポートシステムによって自動的に処理されるようになったため、不要になりました。 - imp モジュールは非推奨になるまで保留中です。 Python 2/3コードベースとの互換性を維持するために、モジュールの削除は現在スケジュールされていません。
- formatter モジュールは非推奨になるまで保留されており、Python3.6で削除される予定です。
- hmac.new()関数のデフォルトの digestmod としての
MD5
は非推奨です。 Python 3.6では、 digestmod 引数として明示的なダイジェスト名またはコンストラクターが必要になります。 - ftplib モジュールの内部
Netrc
クラスは、かなり前からそのdocstringで非推奨として文書化されています。 DeprecationWarning を発行するようになり、Python3.5では完全に削除されます。 - subprocess.Popen.wait()に対する文書化されていない endtime 引数は公開されるべきではなく、うまくいけば使用されていません。 これは非推奨であり、Python3.5で削除される可能性があります。
- HTMLParser の strict 引数は非推奨になりました。
- plistlib readPlist()、 writePlist()、 readPlistFromBytes()、および writePlistToBytes()関数は次のとおりです。対応する新しい関数 load()、 dump()、 load()、および dumps()を優先して非推奨になりました。 Data()は非推奨になり、 bytes コンストラクターを使用するようになりました。
- sysconfig キー
SO
は非推奨になり、EXT_SUFFIX
に置き換えられました。 - さまざまな
open
関数で受け入れられるU
モードは非推奨になりました。 Python3では、何も役に立ちません。 io.TextIOWrapper (必要な場合)とその newline 引数を適切に使用するように置き換える必要があります。 - xml.etree.ElementTree.iterparse()の parser 引数は、 XMLParser()の html 引数と同様に、非推奨になりました。 。 後者の削除に備えるために、
XMLParser
へのすべての引数をキーワードで渡す必要があります。
非推奨の機能
-n
フラグ(サブプロセスなし)を指定して IDLE を実行することは非推奨です。 ただし、この機能は:issue: `18823` が解決されるまで削除されません。- 「site-python」ディレクトリが存在する場合、sys.pathに追加するサイトモジュールは非推奨になりました(:issue: `19375` )。
NS
サポートされなくなったオペレーティングシステム
次のオペレーティングシステムのサポートは、ソースツールとビルドツールから削除されました。
- OS / 2(:issue: `16135` )。
- Windows 2000(チェンジセットe52df05b496a)。
COMSPEC
がcommand.com
(:issue: `14470` )を指すWindowsシステム。- VMS(:issue: `16136` )。
APIと機能の削除
次の廃止され、以前は廃止されたAPIと機能が削除されました。
- メンテナンスされていない
Misc/TextMate
およびMisc/vim
ディレクトリが削除されました(代わりに使用する方法については、 devguide を参照してください)。 SO
makefileマクロが削除されました(SHLIB_SUFFIX
およびEXT_SUFFIX
マクロに置き換えられました)(:issue: `16754` )。PyThreadState.tick_counter
フィールドは削除されました。 その値は、「新しいGIL」が導入されたPython 3.2(:issue: `19199` )以降は意味がありません。PyLoader
とPyPycLoader
は importlib から削除されました。 (:issue: `15641` のTarasLyapunによる寄稿。)- HTTPConnection および HTTPSConnection に対する strict 引数は削除されました。 HTTP0.9スタイルの「SimpleResponses」はサポートされなくなりました。
- 非推奨の urllib.request.Request ゲッターおよびセッターメソッド
add_data
、has_data
、get_data
、get_type
、 [X121X ]、get_selector
、set_proxy
、get_origin_req_host
、およびis_unverifiable
は削除されました(代わりに直接属性アクセスを使用してください)。 - 非推奨の
TYPE_INT64
のロードのサポートは、 marshal から削除されました。 (:issue: `15480` でDanRitiによって寄稿されました。) - inspect.Signature :位置のみのパラメーターに有効な名前を付ける必要があります。
- object .__ format __()は空でないフォーマット文字列を受け入れなくなり、代わりに TypeError を発生させるようになりました。 空でない文字列の使用は、Python3.2以降非推奨になりました。 この変更は、オブジェクトが__format__メソッドを取得した場合に、以前は機能していた(ただし正しくない)コードが失敗し始める状況を防ぐために行われました。つまり、[を使用している場合、コードで TypeError が発生する可能性があります。 X238X] それを処理する__format__メソッドを持たないオブジェクトを含むフォーマットコード。 背景については、:issue: `7994` を参照してください。
difflib.SequenceMatcher.isbjunk()
およびdifflib.SequenceMatcher.isbpopular()
は3.2で非推奨になり、現在は削除されています。x in sm.bjunk
およびx in sm.bpopular
を使用してください。ここで、 sm は[ X127X] SequenceMatcher オブジェクト(:issue: `13248` )。
コードのクリーンアップ
- 未使用で文書化されていない内部
Scanner
クラスは、 pydoc モジュールから削除されました。 - プライベートで効果的に使用されていない
_gestalt
モジュールは、プライベートプラットフォーム関数_mac_ver_lookup
、_mac_ver_gstalt
、および_bcd2str
とともに削除され、これは、ひどく壊れたOSXシステムでのみ呼び出されたはずです(:issue: `18393` を参照)。 - tarfile モジュール名前空間に含まれていた特定の stat 定数のハードコードされたコピーが削除されました。
Python3.4への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
'python'コマンドの動作の変更
- posixシェルでは、
PATH
環境変数を空の値に設定することは、まったく設定しないことと同じです。 ただし、 PYTHONPATH を空の値に設定することは、まったく設定しないことと同等ではありませんでした。 PYTHONPATH 空の値に設定することは、.
に設定することと同等であり、PATH
の動作と同様に推論すると混乱が生じます。 この動作は、PATH
のposix規則に準拠するようになりました。 - CPythonインタープリターのデバッグ(
--with-pydebug
)ビルドの[X refs、Yブロック]出力は、デフォルトでオフになっています。-X showrefcount
オプションを使用して再度有効にすることができます。 (:issue: `17323` のEzioMelottiによる寄稿。) - pythonコマンドとほとんどのstdlibスクリプト(および argparse )は、
stderr
ではなくstdout
に--version
情報を出力するようになりました(問題リストについては[X161Xを参照] ]その他の改善上記)。
PythonAPIの変更
- importlib.abc で定義されたABCは、 NotImplementedError を盲目的に発生させる代わりに、適切な例外を発生させるか、デフォルト値を返すようになりました。 これは、 super()を呼び出し、ABCに至るまでのコードにのみ影響します。 互換性のために、 NotImplementedError または必要に応じて適切な例外の両方をキャッチします。
- モジュールタイプは、 __ package __ および __ loader __ 属性をデフォルトで
None
に初期化するようになりました。 これらの属性が下位互換性のある方法で設定されているかどうかを判断するには、たとえば、getattr(module, '__loader__', None) is not None
。 (:issue: `17115` 。) - importlib.util.module_for_loader()は、
__loader__
と__package__
を無条件に設定して、リロードを適切にサポートするようになりました。 これが望ましくない場合は、これらの属性を手動で設定する必要があります。 モジュール管理にはimportlib.util.module_to_load()
を使用できます。 - インポートにより、関連する属性がリセットされるようになりました(例:
__name__
、__loader__
、__package__
、__file__
、__cached__
)を無条件にリロードします。 これにより、再ロード時にモジュールが再検出されるという意味で、3.3より前の動作が復元されることに注意してください(:issue: `19413` )。 - 凍結されたパッケージは、
__path__
をパッケージ名を含むリストに設定しなくなり、空のリストに設定するようになりました。 凍結されたパッケージと同じ名前のディレクトリも存在する場合、以前の動作により、インポートシステムがサブモジュールのインポートで間違った処理を行う可能性がありました。 モジュールがパッケージであるかどうかを判断する正しい方法は、hasattr(module, '__path__')
(:issue: `18065` )を使用することです。 - 凍結されたモジュールは、
__file__
属性を定義しなくなりました。 フリーズされたモジュールが明示的な場所からロードされないため、属性を設定することは意味的に正しくありません。 モジュールがフリーズされたコードからのものであることを知る必要がある場合は、モジュールの__spec__.location
が'frozen'
に設定されているかどうかを確認し、ローダーが importlib.machinery.FrozenImporterのサブクラスであるかどうかを確認します。 、またはPython 2との互換性が必要な場合は、imp.is_frozen()
を使用できます。 - py_compile.compile()は、書き込むファイルパスがシンボリックリンクまたは非正規ファイルの場合に FileExistsError を発生させるようになりました。 これは、元々のファイルパスの種類に関係なく、インポートによってこれらのファイルが通常のファイルで上書きされるという警告として機能します。
- importlib.abc.SourceLoader.get_source()は、ロードされているソースコードが SyntaxError または UnicodeDecodeError をトリガーしたときに ImportError を発生させなくなりました。 ImportError は、ソースコードが見つからない場合にのみ発生することを意図しているため、ソースコードが見つかったが不適切に構造化されている場合、その意味のオーバーリーチ/オーバーロードであると感じられました。 以前にImportErrorをキャッチしていて、構文またはデコードの問題を引き続き無視したい場合は、3つの例外すべてを今すぐキャッチしてください。
- functools.update_wrapper()および functools.wraps()は、
__wrapped__
属性を、ラップされている関数に正しく設定するようになりました。その関数にも__wrapped__
属性セット。 これは、__wrapped__
属性が、最も内側の関数を参照するチェーン内のすべての__wrapped__
属性ではなく、装飾された関数のスタックを正しくリンクするようになったことを意味します。 以前の動作が意図的なものであると想定したイントロスペクションライブラリは、 inspect.unwrap()を使用して、__wrapped__
属性を持たないチェーンの最初の関数にアクセスできます。 - inspect.getfullargspec()は inspect.signature()の上に再実装されたため、以前よりもはるかに多様な呼び出し可能オブジェクトを処理します。 追加の組み込みおよび拡張モジュールの呼び出し可能オブジェクトは、Python3.4シリーズの過程で署名メタデータを取得することが期待されます。 inspect.getfullargspec()がPython以外の呼び出し可能オブジェクトで失敗することを想定するコードは、それに応じて調整する必要がある場合があります。
- importlib.machinery.PathFinder は、現在の作業ディレクトリを sys.path_hooks 内の空の文字列のオブジェクトに渡すようになりました。 これにより、 sys.path_importer_cache に
が含まれなくなるため、 sys.path に基づいて sys.path_importer_cache を反復処理しても、すべてのキーが検出されるわけではありません。 現在の作業ディレクトリにインポートされたときのモジュールの
__file__
も、インタープリターで-m
を使用する場合を含め、絶対パスを持つようになりました(スクリプトが実行されたときの__main__.__file__
を除く)相対パスを直接使用)(:issue: `18416` のBrettCannonによる寄稿)。 コマンドラインで指定されます)(:issue: `18416` )。 - HTTPConnection および HTTPSConnection への strict 引数の削除は、キーワードではなく位置的に指定している場合、残りの引数の意味を変更します。 非推奨の警告に注意を払っている場合、コードはすでにキーワードを介して追加の引数を指定しているはずです。
from __future__ import ...
ステートメント間の文字列が常にで SyntaxError が発生するようになりました。 以前は、先頭のdocstringがなかった場合、インタースティシャル文字列が無視されることがありました。 これにより、CPythonは言語仕様に準拠します。 JythonとPyPyはすでにそうでした。 (:issue: `17434` )。- ssl.SSLSocket.getpeercert()および ssl.SSLSocket.do_handshake()は、 [ AttributeError を発生させる以前の動作の代わりに、X137X]は接続されていません。 さらに、ハンドシェイクがまだ行われていない場合、 getpeercert()は ValueError を発生させます。
- base64.b32decode()は、入力文字列に TypeError ではなく、非b32アルファベット文字が含まれている場合に、 binascii.Error を発生させるようになりました。 この特定の TypeError は、他の TypeError が変換されたときに見落とされていました。 (:issue: `18011` のSerhiyStorchakaによる寄稿。)注:この変更は、Python3.3.3でも誤って適用されました。
- 作成中の
cgi.FieldStorage
インスタンスがガベージコレクションされると、file
属性が自動的に閉じられるようになりました。cgi.FieldStorage
インスタンスとは別にファイルオブジェクトを引き出し、インスタンスを存続させない場合は、cgi.FieldStorage
インスタンス全体を保存するか、cgi.FieldStorage
インスタンスはガベージコレクションです。 - 閉じたSSLソケットで
read
またはwrite
を呼び出すと、以前のより不思議な AttributeError (:issue: `9177` )。 - ママ.indices()は、巨大な値に対してオーバーフローエラーを生成しなくなりました。 この修正の結果として、ママ.indices()は、負の長さが与えられた場合に ValueError を発生させるようになりました。 以前はナンセンス値を返していました(:issue: `14794` )。
- complex コンストラクターは、 cmath 関数とは異なり、オブジェクトの
__complex__
特殊メソッドが値を返した場合、 float 値を誤って受け入れていました。 これにより、 TypeError が発生します。 (:issue: `16290` 。) - 3.2および3.3の int コンストラクターは、 base パラメーターの float 値を誤って受け入れます。 誰もがこれを行っていた可能性は低いですが、そうであれば、 TypeError (:issue: `16772` )が発生します。
- キーワードのみの引数のデフォルトは、前ではなく、通常のキーワード引数の後のデフォルトで評価されるようになりました。 以前のバグのある動作(:issue: `16967` )に依存するコードを書いた人がいないことを願っています。
- fork()の後で、古いスレッドの状態がクリアされるようになりました。 これにより、以前は誤って永続的に存続していた一部のシステムリソースが解放される可能性があります(たとえば、データベース接続はスレッドローカルストレージに保持されます)。 (:issue: `17094` 。)
__annotations__
dictのパラメーター名は、__kwdefaults__
と同様に、正しくマングルされるようになりました。 (:issue: `20625` でYurySelivanovによって寄稿されました。)- hashlib.hash.name は、常に小文字の識別子を返すようになりました。 以前は一部の組み込みハッシュに大文字の名前が付いていましたが、正式なパブリックインターフェイスになったため、名前の一貫性が保たれました(:issue: `18532` )。
- unittest.TestSuite は実行後にテストへの参照を削除するようになったため、 TestSuite を再利用して一連のテストを再実行するテストハーネスは失敗する可能性があります。 unittest が提供するように設計されているテスト分離を破り、テスト実行間で状態が保持されることを意味するため、テストスイートをこの方法で再利用しないでください。 ただし、分離の欠如が許容できると考えられる場合は、何もしない
_removeTestAtIndex
メソッドを定義する TestSuite サブクラスを作成することで、古い動作を復元できます( TestSuite .__ iter __(を参照) ))(:issue: `11798` )。 - unittest は、コマンドライン解析に argparse を使用するようになりました。 以前は機能していた無効なコマンドフォームがあり、現在は許可されていません。 理論的には、許可されていないコマンドフォームは意味をなさず、使用される可能性が低いため、これによって下位互換性の問題が発生することはありません。
- re.split()、 re.findall()、 re.sub()関数、および
group()
と[X103Xmatch
オブジェクトの] メソッドは、一致する文字列がバイトのようなオブジェクトの場合、常にバイトオブジェクトを返すようになりました。 以前は、戻り型が入力型と一致していたため、コードが戻り値に依存していた場合、たとえばbytearray
の場合は、コードを変更する必要があります。 - audioop 関数は、文字列入力が渡された場合、後でランダムに失敗するのではなく、すぐにエラーを発生させるようになりました(:issue: `16685` )。
- HTMLParser への新しい convert_charrefs 引数は、下位互換性のために現在デフォルトで
False
になっていますが、最終的にはデフォルトでTrue
に変更されます。 コード内の HTMLParser 呼び出し(:issue: `13633` )には、このキーワードを適切な値で追加することをお勧めします。 - hmac.new()関数の digestmod 引数には将来デフォルトがなくなるため、 hmac.new()へのすべての呼び出しを次のように変更する必要があります。 digestmod (:issue: `17276` )を明示的に指定します。
SO
キーを使用して sysconfig.get_config_var()を呼び出すか、 sysconfig.get_config_vars()の呼び出し結果でSO
を検索します。非推奨。 このキーは、コンテキストに応じてEXT_SUFFIX
またはSHLIB_SUFFIX
に置き換える必要があります(:issue: `19555` )。U
を指定するopen
関数の呼び出しはすべて変更する必要があります。U
はPython3では無効であり、使用すると最終的にエラーが発生します。 関数に応じて、 newline 引数を使用するか、必要に応じてストリームを TextIOWrapper でラップして、 newline [を使用することにより、古いPython2の動作と同等の動作を実現できます。 X215X]引数(:issue: `15204` )。- スクリプトで
pyvenv
を使用していて、pip ではなくをインストールしたい場合は、コマンド呼び出しに--without-pip
を追加する必要があります。 - インデントが指定されている場合の json.dump()および json.dumps()のデフォルトの動作が変更されました。行。 これは、そのような出力の空白に敏感な比較を行うテストがある場合にのみ問題になります(:issue: `16333` )。
- doctest は、拡張モジュール
__doc__
文字列でdoctestを検索するようになりました。そのため、doctestテスト検出に、doctestのように見える拡張モジュールが含まれている場合、これまでにないテストの失敗が発生する可能性があります。テストを実行する前(:issue: `3158` )。 - collections.abc モジュールは、Pythonスタートアップの改善の一環として、わずかにリファクタリングされています。 この結果、 collections をインポートすると collections.abc が自動的にインポートされることはなくなりました。 プログラムが(文書化されていない)暗黙的なインポートに依存している場合は、明示的な
import collections.abc
(:issue: `20784` )を追加する必要があります。
CAPIの変更
- PyEval_EvalFrameEx()、 PyObject_Repr()、および PyObject_Str()は、他のいくつかの内部C APIとともに、それらが使用されないことを保証するデバッグアサーションを含むようになりました。現在アクティブな例外をサイレントに破棄する可能性がある状況。 アクティブな例外の破棄が予想され、必要な場合(たとえば、 PyErr_Fetch()でローカルにすでに保存されているか、意図的に別の例外に置き換えられているため)、明示的な PyErr_Clear( )呼び出しは、これらの操作を(直接的または間接的に)呼び出し、アサーションが有効になっているバージョンのPythonに対して実行するときに、アサーションがトリガーされないようにするために必要になります。
- PyErr_SetImportError()は、 msg 引数が設定されていない場合に、 TypeError を設定するようになりました。 以前は、
NULL
のみが返され、例外は設定されていませんでした。 - PyOS_ReadlineFunctionPointer コールバックの結果は、 PyMem_RawMalloc()または PyMem_RawRealloc()、またはエラーが発生した場合は
NULL
によって割り当てられた文字列である必要があります。 、 PyMem_Malloc()または PyMem_Realloc()(:issue: `16742` )によって割り当てられた文字列の代わりに - PyThread_set_key_value()は常に値を設定するようになりました。 Python 3.3では、キーがすでに存在する場合(現在の値が
NULL
以外のポインターである場合)、関数は何もしませんでした。 - PyFrameObject 構造の
f_tstate
(スレッド状態)フィールドは、バグを修正するために削除されました。理由については、:issue: `14432` を参照してください。
3.4.3で変更
PEP 476:stdlibhttpクライアントの証明書検証をデフォルトで有効にする
http.client とそれを使用するモジュール( urllib.request や xmlrpc.client など)は、サーバーがによって署名された証明書を提示することを確認します。プラットフォームトラストストア内のCAであり、そのホスト名がデフォルトで要求されているホスト名と一致するため、多くのアプリケーションのセキュリティが大幅に向上します。
以前の古い動作を必要とするアプリケーションの場合、代替コンテキストを渡すことができます。
import urllib.request
import ssl
# This disables all verification
context = ssl._create_unverified_context()
# This allows using a specific certificate for the host, which doesn't need
# to be in the trust store
context = ssl.create_default_context(cafile="/path/to/file.crt")
urllib.request.urlopen("https://invalid-cert", context=context)