What's New In Python 3.4¶
- 著者
R. David Murray <rdmurray@bitdance.com> (編集者)
この記事では 3.3 と比較した Python 3.4 の新機能を解説します。 Python 3.4 は2014年3月16日にリリースされました。全詳細については 変更履歴 をご覧ください。
参考
PEP 429 -- Python 3.4 リリーススケジュール
概要 -- リリースハイライト¶
新たな文法機能:
Python 3.4 に追加された新しい文法機能はありません。
その他の新しい機能:
隔離モード (isolated mode) の為のコマンドラインオプション (bpo-16499)。
非テキストエンコーディングでの Codec 処理の改良 (複数の issue に関係).
インポートシステムのための ModuleSpec 型 (PEP 451). (インポーターの作者に影響します)
marshal
フォーマットが よりコンパクトで効率的に なりました (bpo-16475)。
新たなライブラリモジュール:
selectors
: 高水準で効率的な I/O の多重化、select
モジュールプリミティブを基にしています (PEP 3156 の一部)。statistics
: 基礎的な 数値的に安定な統計ライブラリ (PEP 450)。
大幅に改善されたライブラリモジュール:
multiprocessing
が Unix で os.fork の使用を避けるオプションを持つようになりました (bpo-8713)。email
にサブモジュールcontentmanager
が追加され、また、Message
のサブクラス (EmailMessage
) が追加されました。これは MIME 処理を簡単にします 。 (bpo-18891)inspect
とpydoc
が以前よりも遥かに幅広い種類の callable オブジェクトを正しくイントロスペクション出来るようになり、これは Pythonhelp()
システムを改善することになりました。ipaddress
モジュール API は安定だと宣言されました。
セキュリティの改善:
ファイル記述子が子プロセスにリークするのを防ぐために 新しく作成されたファイル記述子が継承不可になりました (PEP 446)。
隔離モード (isolated mode) のための新たなコマンドラインオプション (bpo-16499)。
multiprocessing
が Unix で os.fork の使用を避けるオプション を持つようになりました。 子プロセスとのデータ共有を避けるため spawn と forkserver はより安全です。Windows での
multiprocessing
子プロセスはもはや、必要なものを除いて親の継承可能なハンドルを継承しません。新たな関数
hashlib.pbkdf2_hmac()
は PKCS#5 パスワードベースの鍵導出関数2 を提供します。ssl
での TLSv1.1、 TLSv1.2 サポート の追加。ssl
での Windows のシステム証明書ストアよりの証明書抽出サポート の追加。ssl.SSLContext
クラスに 多数の改善 がなされました。SSL をサポートする全ての標準ライブラリモジュールは今や、ホスト名のマッチング (
ssl.match_hostname()
) と証明書失効リスト (CRLs=certification revocation lists。ssl.SSLContext.load_verify_locations()
参照) を含むサーバ証明書検証をサポートします。
CPython の実装の改善:
PEP 442 を活用することで、ほとんどのケースで モジュールのグローバルがファイナライゼーション中に None がセットされることはなくなりました (bpo-18214)。
以降は、たくさんのほかの小さな改善、CPython での最適化、非推奨リスト、潜在的な移植性問題を含む、ユーザ向けの変更の包括的なリストになっています。
新しい機能¶
PEP 453: Python インストール時の PIP の明示的なブートストラッピング¶
デフォルトでの pip のブートストラッピング¶
新しい ensurepip
モジュール(PEP 453 で定義されています)は標準のクロスプラットフォームのメカニズムで、Python インストールと仮想環境に pip インストーラをブートストラップします。Python 3.4.0 に含まれる pip
のバージョンは pip
1.5.4 で、将来の 3.4.x メンテナンスリリースでは Python のリリース候補の作成時点で入手出来る最新バージョンの pip
がバンドルされる予定です。
デフォルトでは pipX
, pipX.Y
コマンドが全てのプラットフォームに、Python パッケージ pip
とその依存物とともにインストールされます(X. Y はインストールされる Python のバージョン)。Windows 実環境と全てのプラットフォームの仮想環境には、バージョンが名前に付与されない pip
コマンドもインストールされます。ほかのプラットフォームでは、システムワイドでバージョンが名前に付与されない pip
コマンドは、典型的には Python 2 を別途インストールした際のものを指しています。
pyvenv
コマンドラインユーティリティと venv
モジュールは、仮想環境で pip
が使えるようにするために ensurepip
モジュールを使います。
コマンドラインユーティリティを使う際は pip
はデフォルトでインストールされます。
venv
モジュールの API を使う際は、 pip
のインストールは明示的に要求しなければなりません。
CPython の source builds on POSIX systems では make install
, make altinstall
コマンドはデフォルトで pip
ブートストラップを行います。この振る舞いは configure のオプションを変更して Makefile を作ることで変更できます。
Windows と Mac OS X では CPython インストーラはそれ自身と一緒に pip
をデフォルトでインストールするようになっています(ユーザはインストールプロセスで除外するかもしれませんが)。Windows ユーザは pip
がコマンドラインからデフォルトで利用可能なように PATH
の自動修正するかの選択を求められます。そうしない場合でも Windows のための Python ランチャで py -m pip
のようにすれば良いです。
discussed in the PEP の通りプラットフォームのパッケージャは、プラットフォームでのそれらインストールの単純明快な手段を自身が提供する(普通システムのパッケージマネージャ)からと言う理由で、デフォルトでのこれらコマンドのインストールを選択しないかもしれません。
注釈
Python 2 と Python 3 の共存インストールでの衝突を避けるために、 ensurepip
を直接呼び出した場合のデフォルトでは、バージョン付けされた pip3
, pip3.4
コマンドだけがインストールされます。バージョン付けのない pip
コマンドもインストールしたければ、 --default-pip
オプションが必要です。 pyvenv
と Windows インストーラは修飾のない pip
コマンドがそれら環境で利用可能となるように保障しますし、また、複数の Python がインストールされたシステムで曖昧さを避けようと直接コマンドを呼び出す代わりに、 pip
は -m
スイッチ経由でいつでも呼び出せます。
ドキュメントの変更¶
この変更の一部は、 Python モジュールのインストール と Python モジュールの配布 セクションがより手短な始め方として完全にデザインし直されたことと、FAQ ドキュメントです。ほとんどのパッケージングについてのドキュメンテーションは Python Packaging User Guide が保守している Python Packaging Authority に移動されて、独立したプロジェクトのドキュメンテーションになっています。
ですが、この移行は現在のところまだ少し不完全ですので、これらのガイドのレガシーなバージョンは Python モジュールのインストール (旧版) と Python モジュールの配布 (レガシーバージョン) に残してあります。
参考
- PEP 453 -- Python インストールの際の明示的なpipのブートストラッピング
PEP は Donald Stufft と Nick Coghlan によって書かれ、Donald Stufft, Nick Coghlan, Martin von Löwis, Ned Deily により実装されました。
PEP 446: 新規作成されたファイル記述子は継承不可¶
PEP 446 により、新規作成するファイル記述子は 継承不可 (non-inheritable) となります。一般的にはこれこそがアプリケーションが望む振る舞いです。新たにプロセスを生成する際に、現在開いているファイルを起こした子プロセスでも開くことは、検出が困難なあらゆるバグや潜在的なセキュリティ問題を引き起こしかねません。
そうはいっても継承することが望ましい場合もあります。それらのケースをサポートするために、以下の新規関数とメソッドが利用出来ます:
参考
- PEP 446 -- 新規作成されたファイル記述子を継承不可にする
PEP written and implemented by Victor Stinner.
Codec 処理の改良¶
その最初の導入からずっと、 codecs
モジュールとはいつなんどきも、型に中立で動的なエンコーディング・デコーディングシステムとして働くものであったのです。そうなのですがその Python テキストモデルとの密接な結合、特に組み込み型 str
, bytes
, bytearray
にある型に制限があるコンビニエンスメソッドのおかげで、歴史的にその本来の意図を曖昧にしてきたのでした。
そんな状況を清く正しくするための重要な一歩として、今ではコンビニエンス関数 codecs.encode()
, codecs.decode()
が Python 2.7、3.3、3.4 で適切にドキュメントされました。これら関数は codecs
モジュールに Python 2.4 からずっと存在している (うえに回帰テストスイートでもずっと網羅してきた) のですが、以前はドキュメントされていなかったわけなので、実行時イントロスペクションでようやく見つけられるというものだったわけです。
str
, bytes
, bytearray
でのコンビニエンスメソッドが Python 3 では Unicode テキストエンコーディングに制限され、Python 2 では basestring
<-> basestring
変換に制限されるのとは違うのです。 codecs
のコンビニエンス関数は Python 2 と Python 3 の両方で任意のコーデックをサポートするのです。
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)
そしてついに、ここまで実例で見てきたような的確な誘導による改善が、それ自体は Python 3.2 で復活していた非 Unicode コーデックへのコンビニエンスのエイリアスの復活を可能にしました。(---訳注: Python 3.0 で一度非 Unicode エンコーディングは消滅し、3.2 でそれらコーデックそのものは復活したものの、 Lib/encodings/aliases.py のマッピングからは除外されたままだった。---) つまり、バイナリデータの 16 進表現エンコードとそのデコード (たとえば、です) は、今ではこう書けるということです:
>>> from codecs import encode, decode
>>> encode(b"hello", "hex")
b'68656c6c6f'
>>> decode(b"68656c6c6f", "hex")
b'hello'
標準ライブラリで提供されるバイナリ変換とテキスト変換は、 バイナリ変換 (Binary Transforms) と テキスト変換 (Text Transforms) に詳細記述されました。
(Contributed by Nick Coghlan in bpo-7475, bpo-17827, bpo-17828 and bpo-19619.)
PEP 451: インポートシステムのための ModuleSpec 型¶
PEP 451 は、インポート機構がロードに使うモジュールに関する情報 (つまりモジュールの仕様) のカプセル化を提供します。これはインポートの実装とインポート関連 API の両方を単純化するのに役立ちます。この変更は、 いくつかの将来のインポート関連の改善 の足掛かりでもあります。
この PEP による公な側面での変化は完全に後方互換です。さらにそれらは、インポーターの作者以外にとっては透過的であるはずです。鍵となるファインダとローダのメソッドはまだ動作し続けますが非推奨となりました。新しいインポータは PEP に記述された新メソッドを使うべきです。既存のインポータは新メソッドを実装するように更新すべきです。置き換えられるべきメソッドとその代わりとなるメソッドのリストについては 非推奨 を参照してください。
その他の言語変更¶
Python 言語コアに小さな変更がいくつか行われました:
Unicode データベースを UCD バージョン 6.3 にアップグレードしました。
min()
とmax()
にキーワード専用引数 default が追加されました。これにはイテラブルが要素なしであると評価される場合に返す値を指定出来ます。 (Contributed by Julian Berman in bpo-18111.)モジュールオブジェクトが
weakref
可能になりました。モジュールの
__file__
属性 (と関連する値) にはデフォルトでは常に絶対パスを含むようになりました。ただし、スクリプトがコマンドラインから相対パスを使って直接実行された際の__main__.__file__
は唯一の例外です。 (Contributed by Brett Cannon in bpo-18416.)UTF-16 デコーダ (妥当なサロゲートペアを受け付ける) と UTF-16 エンコーダ (非 BMP 文字のエンコードでサロゲートペアを生成) 以外の、(UTF-7 を除く) 全ての UTF-* コーデックが、エラーハンドラ
surrogatepass
を使わない限りはエンコーディングとデコーディングの両方でサロゲートペアを拒絶するようになりました。(Contributed by Victor Stinner, Kang-Hao (Kenny) Lu and Serhiy Storchaka in bpo-12892.)新規ドイツ語 EBCDIC codec
cp273
. (Contributed by Michael Bierenfeld and Andrew Kuchling in bpo-1097797.)新規ウクライナ語 codec
cp1125
. (Contributed by Serhiy Storchaka in bpo-19668.)bytes
.join() とbytearray
.join() が引数として任意のバッファオブジェクトを受け取れるようになりました。 (Contributed by Antoine Pitrou in bpo-15958.)int
コンストラクタの base 引数に、__index__
メソッドを持つ任意のオブジェクトを渡せるようになりました。(Contributed by Mark Dickinson in bpo-16772.) (---訳注: Python API の変更 に同じ bpo-16772 を発端とする変更が書かれているのでそちらも参照して下さい。 ---)フレームオブジェクトに、ローカル変数への全ての参照をフレームからクリアするメソッド
clear()
が追加されました。(Contributed by Antoine Pitrou in bpo-17934.)memoryview
がSequence
として登録され、また、組み込み関数reversed()
をサポートするようになりました。 (Contributed by Nick Coghlan and Claudiu Popa in bpo-18690 and bpo-19078.)Argument Clinic の導入、
inspect
とpydoc
になされた他の変更の結果、多くの場合でhelp()
が報告するシグニチャが修正・改善されました。__length_hint__()
が、公式な言語仕様の一部になりました (see PEP 424)。 (Contributed by Armin Ronacher in bpo-16148.)
新たなモジュール¶
asyncio¶
asyncio
モジュールが追加されました (PEP 3156 で定義されています)。これは Python のための標準的で抜き挿し可能なイベントループモデルを、標準ライブラリに信頼出来る非同期 I/O サポートを追加することで提供し、また、ほかのイベントループ実装を標準ライブラリと相互運用することを容易にします。
Python 3.4 では、このモジュールは 暫定 API であるとみなされています。
ensurepip¶
新規の ensurepip
モジュールは PEP 453 実装のための本質的な基盤です。通常はエンドユーザはこのモジュールを弄ぶ必要はありません。ですが、 pip
のインストレーションや仮想環境に対する自動ブートストラップを拒否していた場合には、手動でそれをブートストラップするのに使えます。
ensurepip
は pip
のバンドルされたコピーを含んでいて、これは CPython リリースの最初のリリース候補時点での最新です (このことはメンテナンスリリース、feature リリースの両方に適用されます)。 ensurepip
自身はインターネットアクセスしません。依存パッケージ解決のためのインターネットアクセスを要するならばそれは ensurepip
実行の後の pip
で行いますし、 pip
そのもののアップグレードも pip
自身で行います。(そのようなアップグレード版 pip
は個別のインストールパッケージとみなされて、Python がアンインストールされても削除されないことを付記しておきます。)
このモジュールが「 ensure (保障する) 」を名前に冠するのは、 pip
がインストール済みならば何もしないからです。このモジュールは --upgrade
オプションを持ちますが、これは既存のインストール版 pip
がこのモジュールにバンドルされたコピーよりも古い場合に、バンドルされたコピー版 pip
をインストールします。
enum¶
enum
モジュール (PEP 435 にて定義) は標準の列挙型実装を提供します。これにより (socket
のような) ほかのモジュールが、不透明な整数定数を後方互換を保ったまま列挙値に置き換えることによって、より情報に富むエラーメッセージを提供したり、より良いデバッグサポートを行えるようになります。
参考
- PEP 435 -- Python 標準ライブラリに enum 型を追加
PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman, implemented by Ethan Furman.
pathlib¶
新規モジュール pathlib
は、異なるオペレーティングシステムごとに適切な意味付けでファイルシステムパスを表現するクラス群を提供しています。パスのクラス群は 純粋パス と 具象パス に分離されています。前者は I/O を伴わない純粋なパス計算操作を提供するもので、後者は純粋パスを派生しますが I/O 操作も提供します。
Python 3.4 では、このモジュールは 暫定 API であるとみなされています。
参考
- PEP 428 -- pathlib モジュール -- オブジェクト指向のファイルシステムパス
PEP written and implemented by Antoine Pitrou.
selectors¶
新規モジュール selectors
(PEP 3156 の一部として作成されました) は、高水準で効率的な I/O の多重化を行います。これは select
モジュールプリミティブに基いています。
statistics¶
新規モジュール statistics
(PEP 450 で定義) は統計を扱う中核機能のいくつかを標準ライブラリで直接提供します。このモジュールはデータ系列の平均、中央値、最頻値、分散、標準偏差の計算をサポートします。
参考
- PEP 450 -- 標準ライブラリに統計モジュールを追加
PEP written and implemented by Steven D'Aprano
tracemalloc¶
新たな tracemalloc
モジュール (PEP 454 で定義) は Python が割り当てたメモリブロックをトレースするためのデバッグツールです。
以下の情報を提供します:
オブジェクトが割り当てられた場所をトレースする
ファイル名ごと、及び行ごとに割り当てられたメモリブロックの以下の統計を取ります:総サイズ、ブロック数、割り当てられたブロックの平均サイズ
メモリリークを検出するために2つのスナップショットの差を計算します。
参考
- PEP 454 -- Python メモリ割り当てをトレースするための tracemalloc モジュールの追加
PEP written and implemented by Victor Stinner
改良されたモジュール¶
abc¶
新規関数 abc.get_cache_token()
は、オブジェクトグラフ内での変化の影響を受けるキャッシュをいつ無効化すれば良いかを知るために使えます。 (Contributed by Łukasz Langa in bpo-16832.)
新規クラス ABC
はそのメタクラスとして ABCMeta
を持ちます。この ABC
を基底クラスとして使うことは metaclass=abc.ABCMeta
を指定するのと本質的に同じ効果を持ちますが、少ないタイプ数で単純に書ける上に読みやすいものになります。(Contributed by Bruno Dupuis in bpo-16049.)
aifc¶
getparams()
メソッドがプレインなタプルではなく namedtuple
を返すようになりました。 (Contributed by Claudiu Popa in bpo-17818.)
aifc.open()
がコンテキスト管理プロトコルをサポートするようになりました: with
ブロックで使うと戻り値オブジェクトの close()
メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchacha in bpo-16486.)
writeframesraw()
メソッドと writeframes()
メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)
argparse¶
FileType
クラスが encoding 引数、 errors 引数を受け付けるようになりました。これは open()
にそのまま渡されます。 (Contributed by Lucas Maystre in bpo-11175.)
audioop¶
audioop
は 24 ビットサンプルをサポートするようになりました。 (Contributed by Serhiy Storchaka in bpo-12866.)
新規関数 byteswap()
はビッグエンディアンのサンプル、リトルエンディアンのサンプルの相互変換を行います。 (Contributed by Serhiy Storchaka in bpo-19641.)
全ての audioop
関数が今では任意の bytes-like object を受け付けます。文字列は許容されません。文字列では以前から動作しませんでしたが、ただちに例外を投げるように変更されました。 (Contributed by Serhiy Storchaka in bpo-16685.)
base64¶
base64
のエンコード・デコード関数が任意の bytes-like object オブジェクトを受け取れるようになりました。以前は bytes
または bytearray
インスタンスである必要がありました。 (Contributed by Nick Coghlan in bpo-17839.)
新規関数 a85encode()
, a85decode()
は Ascii85
フォーマットの、 b85encode()
, b85decode()
は git/mercurial の Base85
フォーマットの、バイナリデータのエンコード・バイナリデータへのデコードを提供します。 a85
関数は、Abobe 方言を含む Ascii85
エンコーディングの変種と互換性を持たせるためのオプションを持っています。(Contributed by Martin Morrison, the Mercurial project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618.)
collections¶
ChainMap.new_child()
メソッドが、チェーンに追加する子マップを指定する m 引数を取るようになりました。これにより、以前は組み込み辞書が必ず maps の先頭になっていましたが、カスタムマッピング型も使えるようになります。(Contributed by Vinay Sajip in bpo-16613.)
colorsys¶
RGB --- YIQ 変換の係数の桁数が FCC NTSC version に合うように広げられました。結果としての変化は 1% 未満のはずで、また、ほかの処理系での結果とより合致するでしょう。 (Contributed by Brian Landers and Serhiy Storchaka in bpo-14323.)
contextlib¶
新規コンテキストマネージャ contextlib.suppress
によって、意図して単独ステートメントからの例外を抑制しているというコードの意図をはっきりと読み手に伝えることが出来ます。 (Contributed by Raymond Hettinger in bpo-15806 and Zero Piraeus in bpo-19266.)
新規コンテキストマネージャ contextlib.redirect_stdout()
は、ユーティリティスクリプトにて、その出力を sys.stdout
に書き出す一方でその向き先を変えれない頑固な API の扱いを簡単にしてくれます。これを使うと、 sys.stdout
出力をなにかほかのストリームに振り替えたり、あるいは io.StringIO
と組み合わせて文字列化したり出来ます。後者などは特に便利で、たとえば元々はコマンドラインインターフェイスとして実装された関数からの出力を取り込む、などということが出来ます。このコンテキストマネージャはユーティリティスクリプト以外では使わない方が肝要です。というのもこれは sys.stdout
の大域的な状態に影響を与えてしまうからです。 (Contributed by Raymond Hettinger in bpo-15805.)
contextlib
ドキュメントにも改善が行われ、コンテキストマネージャを単独で使うのと再利用したり再入可能(リエントラント)するのとの違いについての 議論 が追加されました。
dbm¶
dbm.open()
がコンテキスト管理プロトコルをサポートするようになりました: with
ブロックで使うとデータベースオブジェクトの close
メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Claudiu Popa and Nick Coghlan in bpo-19282.)
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()
もあります。トレースバックから Bytecode
を構築します。(print(Bytecode.from_traceback(tb).dis())
は distb()
を使って distb(tb)
とするのと同じです。)
(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in bpo-11816 and Claudiu Popa in bpo-17916.)
新規関数 stack_effect()
は与えられた opcode (命令コード) と引数の Python スタックへの effect を計算します。この情報は他からは得られません。 (Contributed by Larry Hastings in bpo-19722.) (---訳注: PyCompile_OpcodeStackEffect
として C API として曝した上で Python からアクセス出来るようにしたものらしいです。 stackdepth_walk での使用箇所 参照。---)
doctest¶
新規 オプションフラグ の FAIL_FAST
により、テスト実行を最初の失敗検出で終了させることが出来ます。 (Contributed by R. David Murray and Daniel Urban in bpo-16522.)
doctest
コマンドラインインターフェイスは argparse
を使うようになりました。2 つの新オプション -o
と -f
が追加されています。 -o
によりコマンドラインから doctest オプション を指定することが出来ます。 -f
は -o FAIL_FAST
の速記法です (unittest
CLI でサポートされる似たオプション サポートされる同じオプション に似せるためです)。 (Contributed by R. David Murray in bpo-11390.)
doctest
はいまや、拡張モジュールの __doc__
文字列から doctest を見つけることが出来ます。 (Contributed by Zachary Ware in bpo-3158.)
email¶
as_string()
メソッドが、その文字列表現を生成するのに使うデフォルトポリシーを上書き出来る policy 引数を取るようになりました。つまり Message
を作り直したり flattern
メソッドの書式化パラメータのためだけに generator
を使うことなしに、 as_string
をより多くの状況で使えるということになります。(Contributed by R. David Murray in bpo-18600.)
as_bytes()
メソッドが追加されました。これは as_string
が文字列表現を生成するのと似たやり方で、メッセージの bytes 表現を生成します。これは maxheaderlen 引数を取りませんが、 unixfrom 引数と policy 引数を取ります。 Message
の __bytes__()
がこれを呼び出すようにしたので、 bytes(mymsg)
は今や直感に反しない結果、つまり完全にフォーマットされたメッセージを生成します。(Contributed by R. David Murray in bpo-18600.)
Message.set_param()
メソッドにキーワード引数 replace が追加されました。真を渡すとヘッダリスト内のその位置を変更せずに関連ヘッダを更新します。後方互換のためにデフォルトは False
です。 (Contributed by R. David Murray in bpo-18891.)
サブモジュール contentmanager
と policy
属性の content_manager
の追加と併せて、 Message
の対となる二つのサブクラス (EmailMessage
と MIMEPart
) が追加されました。
全てのドキュメントは、 email の新規 暫定 API の構成要素として追加されたこの新しいモジュールにあります。
これらのクラスは、 email メッセージからの内容抽出や挿入を遥かに簡単に行える、数多くの新規メソッドを提供しています。
詳細は contentmanager
のドキュメントと email: 使用例 を参照してください。
これらの API の追加作業により email6 プロジェクトの一部として計画されていた作業は、その大部分が完了しました。
現在のところ、暫定 API 状態は Python 3.5 で最後となる予定です (可能性としてはエラー処理あたりのゾーンでは少々の些細な追加は残るかもしれません)。 (Contributed by R. David Murray in bpo-18891.)
filecmp¶
clear_cache()
関数が追加されました。 filecmp
は os.stat()
情報をキャッシュして最後の比較時点からのファイルの変化をみていますが、このキャッシュをクリアします。これはたとえば、ファイルシステムのタイムスタンプフィールドの解像度未満の時間差で再比較したい場合に使えるでしょう。(Contributed by Mark Levitt in bpo-18149.)
dircmp()
関数に与える ignore パラメータのデフォルト値を、新規のモジュール属性 DEFAULT_IGNORES
で指定出来るようになりました。無視するディレクトリのリストで指定してください。(Contributed by Eli Bendersky in bpo-15442.)
functools¶
新たな partialmethod()
デスクリプタは、ちょうど普通の callable に対して partial()
がするように、デスクリプタへの引数部分適用を可能にします。この新しいデスクリプタをクラス定義内で使うと、簡単に (partial()
インスタンスを含む) 任意の callable を普通のインスタンスメソッドのように振舞わせることも出来ます。(Contributed by Alon Horev and Nick Coghlan in bpo-4331.)
新たな singledispatch()
デコレータは、Python 標準ライブラリにシングルディスパッチのジェネリック関数のサポートを追加します。オブジェクト指向プログラミングは共通データ集合についての複数操作をまとめあげてクラスに押し込めようとしますが、ジェネリック関数は 異なった 種類のデータに対して動作させたい操作の複数実装をひとつにまとめあげる考え方です。(---訳注: ここで「ジェネリック関数」と呼んでいるものを他の言語との類推で理解しようとすると、「呼び出す側目線」では同じで、「呼び出される側」目線では違うかもしれません。例えば C++ ユーザは「template の特殊化」もしくは「型ごとのオーバロード」との類推で理解してください。---)
参考
- PEP 443 -- シングルディスパッチのジェネリック関数
PEP written and implemented by Łukasz Langa.
total_ordering()
は基となる比較関数が NotImplemented
を値として返すのをサポートするようになりました。 (Contributed by Katie Miller in bpo-10042.) (---訳注: functools.py のコメント 参照。---)
partial()
関数のピュア Python 版が標準ライブラリに追加されました。CPython の場合は C による高速版で置き換えられますが、ほかの Python 実装で利用出来ます。 (Contributed by Brian Thorne in bpo-12428.)
gc¶
新規関数 get_stats()
は、インタプリタが開始してからの、世代ごと回収統計を持つ辞書の、3 世代ぶんのリストを返します。(Contributed by Antoine Pitrou in bpo-16351.)
glob¶
新規関数 escape()
は、glob 的な展開がなされないようにして字句通りの合致をするように、ファイル名に含まれる特殊文字をエスケープする手段となります。(Contributed by Serhiy Storchaka in bpo-8402.)
hashlib¶
新たな関数 hashlib.pbkdf2_hmac()
は PKCS#5 パスワードベースの鍵導出関数2 を提供します。 (Contributed by Christian Heimes in bpo-18582.)
hashlib
のハッシュオブジェクトの name
属性が、公式にサポートされるインターフェイスになりました。これは CPython の hashlib
には以前から存在していました (ただしサポートされるハッシュの名前を必ずしも小文字で返してはいませんでした) が、公開インターフェイスとしていなかったために、ほかのいくつかの Python 実装では以前はサポートされていませんでした。(Contributed by Jason R. Coombs in bpo-18532.)
hmac¶
hmac
は、 new()
の key 引数として bytearray
と bytes
を許容するようになり、また、 new()
関数と update()
メソッドの両方への msg パラメータとして、 hashlib
モジュールがサポートする任意の型を許容するようになりました。(Contributed by Jonas Borgström in bpo-18240.)
hmac.new()
関数への digestmod 引数には、hashlib
が認識する任意のハッシュダイジェスト名を渡せるようになりました。これとともに、 digestmod のデフォルトとして MD5
を使う現在の振る舞いは非推奨です。将来のバージョンの Python ではこれのデフォルト値はなくなり、指定が必須になります。 (Contributed by Christian Heimes in bpo-17276.)
block_size
属性と name
属性 (と digest_size
属性の公式ドキュメント) の追加をもって、 hmac
モジュールは完全に PEP 247 API を遵守するものとなりました。 (Contributed by Christian Heimes in bpo-18775.)
html¶
新規関数 unescape()
は HTML5 文字参照を対応する Unicode 文字に変換します。 (Contributed by Ezio Melotti in bpo-2927.)
HTMLParser
が新規キーワード引数 convert_charrefs を受け取ります。これが True
の場合に、全ての文字参照が自動的に変換されます。後方互換性の問題から今はこのデフォルトを False
にしてありますが、将来バージョンの Python でこれを True
に変えます。ですから値は明示的にセットしてこの新しい機能を使うように更新しておくと良いです。(Contributed by Ezio Melotti in bpo-13633.)
HTMLParser
の strict 引数が非推奨となりました。 (Contributed by Ezio Melotti in bpo-15114.)
http¶
send_error()
がオプショナルなパラメータ explain を受け付けるようになりました。指定されると、拡張のエラー説明を提供するにあたって、ハードコードされたデフォルトの代わりに使われます。この拡張のエラー説明は error_message_format
属性を使ってフォーマットされて、エラーレスポンスのメッセージボディとして送信されます。(Contributed by Karl Cow in bpo-12921.)
http.server
の コマンドラインインターフェイス に -b/--bind
オプションが追加されました。これは特定のアドレスで listen することを指示します。 (Contributed by Malte Swart in bpo-17764.) (---訳注: ネットワークプログラミングに詳しい人ほど混乱しそうなので一応。 --bind
というオプション名が示すとおり、より正確に表現するなら「ユーザ指定のネットワークインターフェイスに bind」。コミットログの表現「Expose --bind argument for http.server, enable http.server to bind to a user specified network interface.」の方がわかりやすいかと。 ---)
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)
と同じです。 (Contributed by Eric Snow and Brett Cannon in bpo-15627.)
InspectLoader
では get_code()
メソッドへのデフォルト実装追加も行われました。とはいえ性能面の理由より、通常はデフォルト実装をオーバライドすることが望ましいです。 (Contributed by Brett Cannon in bpo-18072.)
imp
モジュール撤廃に向けて、 imp
にあった reload が importlib
reload()
関数に移動しました。 (Contributed by Berker Peksag in bpo-18193.)
importlib.util
に MAGIC_NUMBER
属性が追加されました。これはバイトコードのバージョン番号へのアクセスを提供します。これは非推奨の imp
モジュールにある get_magic()
関数を置き換えるものです。 (Contributed by Brett Cannon in bpo-18192.)
撤廃されるモジュール imp
での同名関数を置き換える新規関数として、 importlib.util
関数の cache_from_source()
と source_from_cache()
が追加されました。 (Contributed by Brett Cannon in bpo-18194.)
importlib
ブートストラップ NamespaceLoader
が InspectLoader
ABC に従うようになりました。つまりこれにより runpy
と python -m
が名前空間パッケージに対して使えるようになりました。(Contributed by Brett Cannon in bpo-18058.) (訳注: 3.3 以降の名前空間パッケージについては What's New In Python 3.3 (PEP 420) 参照。)
importlib.util
に decode_source()
関数が追加されました。 universal newlines 処理を使って bytes からソースをデコードします。 InspectLoader.get_source()
メソッドを実装するのに便利です。
importlib.machinery.ExtensionFileLoader
に get_filename()
メソッドが追加されました。これは本来実装されるべきものでしたが見落とされていました。(Contributed by Eric Snow in bpo-19152.)
inspect¶
inspect
モジュールに、ソースコードおよびモジュール・クラス・関数についてのその他情報を手早く表示するための、基礎的な コマンドラインインターフェイス が追加されました。 (Contributed by Claudiu Popa and Nick Coghlan in bpo-18626.)
新規の unwrap()
で、 functools.wraps()
(やラッパー関数に __wrapped__
属性をセットするその他 API) で作られたラッパー関数のチェインを、簡単にほどくことが出来ます。 (Contributed by Daniel Urban, Aaron Iles and Nick Coghlan in bpo-13266.) (---訳注: 「簡単に」の意味するところについて、 Python API の変更 に記述されている functools.update_wrapper()
と functools.wraps()
の変更も参照して下さい。---)
新規 enum
モジュールが実装されたことを受け inspect
モジュールは、カスタム __dir__
メソッドに対する、またメタクラスを介して提供される動的クラス属性に対する、ずっと良いサポートを提供出来るようになりました。 (Contributed by Ethan Furman in bpo-18929 and bpo-19030.)
getfullargspec()
と getargspec()
が signature()
API を使うようになりました。このことで、以前より遥かに幅広い callable をサポートするようになっています。それには __signature__
属性を含むもの、 Argument Clinic で提供されるメタデータを含むもの、あるいは functools.partial()
オブジェクト、なども含まれます。 signature()
そのものとは違い、今でも getfullargspec()
, getargspec()
は __wrapped__
属性を無視し、そして束縛されたメソッドで最初に束縛された引数を報告するので、それが望みでないならば signature()
を直接使うようにあなたのコードを更新する必要があります。(Contributed by Yury Selivanov in bpo-17481.) (---訳注: What's New In Python 3.5 を参照してください。 signature()
により getfullargspec()
と getargspec()
は結果として非推奨となりました。---)
signature()
が CPython 関数のダックタイプをサポートするようになりました。これは Cython でコンパイルされた関数をサポートすることになります。 (Contributed by Stefan Behnel and Yury Selivanov in bpo-17159.) (---訳注: duck type はここでは「 types.FunctionType
であることを要求しない」の意味。 _signature_is_functionlike 参照。 ---)
ipaddress¶
ipaddress
は Python 3.3 で標準ライブラリに 暫定 API として追加されました。Python 3.4 リリースで、この但し書きは削除されました: ipaddress
は今や安定 API とみなされ、今後は通常の標準ライブラリの後方互換性維持要件に従います。
新規のプロパティ is_global
は、アドレスが routeable である場合に True
を返します。 (Contributed by Peter Moody in bpo-17400.) (---訳注: リファレンスマニュアルでは routeable という表現ではなく「アドレスがパブリックネットワークに割り当てられている場合」。---)
logging¶
TimedRotatingFileHandler
に atTime パラメータが追加されました。ロールオーバ対象となる日付での時刻を指定します。 (Contributed by Ronald Oussoren in bpo-9556.)
SocketHandler
と DatagramHandler
が Unix ドメインソケットをサポートするようになりました (port に None
をセットすることで)。 (Contributed by Vinay Sajip in commit ce46195b56a9 .)
fileConfig()
が fname パラメータとして configparser.RawConfigParser
のサブクラスを許容するようになりました。これはロギングの設定がアプリケーション全体の設定の一部に過ぎない場合や、 fileConfig()
に渡す前にアプリケーションが設定を修正するような場合でも設定ファイルを使用することを容易にします。(Contributed by Vinay Sajip in bpo-16110.)
logging.config.listen()
関数経由でソケットから受信したロギング設定データを、処理前に検証出来るようになりました。新規のキーワード引数 verify に検証関数を渡すことで可能です。(Contributed by Vinay Sajip in bpo-15452.)
marshal¶
marshal
のバージョンが 3 に上げられました。新バージョンを実装しているコードは、intern された文字列をただ一つのコピーだけ記録しておきデシリアライズでその intern を維持するという Python 2 での振舞いを復活させつつ、「ただ一つのコピー」を文字列型のみならず任意のオブジェクト型に (再帰参照の処理も含め) 拡張しています。これは .pyc
ファイルのサイズを削減し、また、 .pyc
(または .pyo
) ファイルからロードされる際にモジュールが占めるメモリ量を削減します。(Contributed by Kristján Valur Jónsson in bpo-16475, with additional speedups by Antoine Pitrou in bpo-19219.)
mmap¶
mmap オブジェクトが weakref
可能になりました。 (Contributed by Valerie Lambert in bpo-4885.)
multiprocessing¶
multiprocessing
を使ってプロセスを開始する 開始方式 として、Unix において 2 つ、 spawn
と forkserver
が追加されました。これらはスレッドとプロセスのミックスをより堅牢にし、また、 spawn
は multiprocessing が以前から常に Windows で使ってきたセマンティクスと一致します。新規関数の、 get_all_start_methods()
はプラットフォームで利用出来るすべての開始方式を報告し、 get_start_method()
は現在設定されている開始方式を報告し、 set_start_method()
は開始方式を設定します。(Contributed by Richard Oudkerk in bpo-8713.)
multiprocessing
には、子プロセスがどのように作られるかを決定する context
のコンセプトが追加されています。新規関数 get_context()
は指定した開始方式を使うコンテキストを返します。コンテキストは multiprocessing
モジュール自身と同じ API を持っているので、コンテキスト内で操作する Pool
や他のオブジェクトを、それを使って作成することが出来ます。コンテキストによって、フレームワークとアプリケーションあるいは同じアプリケーションの別の部分が相互に干渉しあわないようにして multiprocessing を使うことが出来ます。(Contributed by Richard Oudkerk in bpo-18999.)
昔からの fork 開始方式を除き、子プロセスはもはや必要のないハンドル・ファイル記述子をその親から継承しません。 (part of bpo-8713).
multiprocessing
が開始方式に spawn
または forkserver
を使う場合に、子プロセスで適切に __main__
を初期化するために runpy
(これが -m
スイッチを実装しています) に頼るようになりました。これは、 multiprocessing と -m
コマンドラインスイッチ・明示的な相対インポートを組み合わせると子プロセスが不可解に失敗していたような、いくつかの際どい問題を解決します。 (Contributed by Nick Coghlan in bpo-19946.)
operator¶
新規関数 length_hint()
は、言語仕様となった特殊メソッド __length_hint__()
の PEP 424 公式仕様の一環として、それがどのように使われるのかについて詳述する実装を提供します。(Contributed by Armin Ronacher in bpo-16148.)
参照実装として、また Python 実装の代替として用いることが出来る、 operator
モジュールのピュア Python 版が書かれました。 (Contributed by Zachary Ware in bpo-16694.)
os¶
新規関数により 継承可能フラグ を制御出来るようになりました。ファイル記述子には os.get_inheritable()
, os.set_inheritable()
を、Windows のハンドルには os.get_handle_inheritable()
, os.set_handle_inheritable()
を使います。
関数 cpu_count()
が追加されました。これは Python を実行しているプラットフォームで利用可能な CPU 数を返します (決定できない場合は None
を返します)。既存の multiprocessing.cpu_count()
はこの関数の値を返すようになりました。(Contributed by Trent Nelson, Yogesh Chaudhari, Victor Stinner, and Charles-François Natali in bpo-17914.)
os.path.samestat()
が Windows プラットフォームでも動作するようになりました (また、 os.path.samefile()
の実装は Unix と Windows で共有されました)。 (Contributed by Brian Curtin in bpo-11939.)
os.path.ismount()
が Windows において、ドライブルートよりも下にあるマウントポイントを認識するようになりました。 (Contributed by Tim Golden in bpo-9035.)
os.open()
が新たな 2 つのフラグを、それを提供しているプラットフォームでサポートするようになりました。 O_PATH
(未オープンファイル記述子)、 O_TMPFILE
(名前なし一時ファイル; Python 3.4.0 リリース時点では、 uapi ヘッダを持っているカーネルバージョン 3.11 以降の Linux システムでのみ利用可能) です。 (Contributed by Christian Heimes in bpo-18673 and Benjamin Peterson, respectively.)
pdb¶
pdb
が、ジェネレータ、 yield
、 yield from
をより価値ある方法で処理するように強化されました。これは asyncio
ベースのプログラムをデバッグする際にとりわけ助けとなります。 (Contributed by Andrew Svetlov and Xavier de Gaye in bpo-16596.)
pdb
から print
コマンドは削除され、pdb コマンドラインからの Python print()
関数へのアクセスを取り戻しました。 Python 2 の pdb
には print
コマンドはなく print
の入力は Python 2 の print
文を実行していました。 Python 3 で pdb の p
コマンドへのエイリアスとして print
を作ったのが間違いでした。 p
はその引数の repr
を表示するのであって、Python 2 での print
コマンドがしていた str
を表示するのではありません。さらに悪いことに、Python 3 の pdb print
コマンドは Python 3 の print
関数を隠してしまい、 pdb
プロンプトからのアクセスを出来なくしていたのでした。 (Contributed by Connor Osborn in bpo-18764.)
pickle¶
pickle
で新 pickle プロトコル 4 が追加されました (デフォルトにはされていません)。この新プロトコルは、入れ子のクラスや巨大な文字列・コンテナやキーワード専用引数を取る __new__()
メソッドを持つクラスなどにまつわるシリアライズの問題など、以前のプロトコルに存在していた数多くの問題を措置しています。ほかにもいくつか効率面での改善が入っています。
参考
- PEP 3154 -- Pickle プロトコル 4
PEP written by Antoine Pitrou and implemented by Alexandre Vassalotti.
plistlib¶
plistlib
が、ほかのシリアライズ化プロトコルを扱う標準ライブラリでのお決まりのパターンに従った新 API を追加しました。 load()
, dump()
, loads()
, dumps()
です。(なので旧 API は非推奨です。) また、既にサポートされている XML plist フォーマット (FMT_XML
) に加えてバイナリ plist フォーマット(FMT_BINARY
) のサポートも追加されました。 (Contributed by Ronald Oussoren and others in bpo-14455.)
poplib¶
poplib
に 2 つの新規メソッドが追加されました。 capa()
は POP サーバにより公表された機能リストを返します。 stls()
は平文 POP3 セッションを、POP サーバがサポートしていれば暗号化された POP3 セッションに切り替えます。 (Contributed by Lorenzo Catucci in bpo-4473.)
pprint¶
pprint
モジュールの、 PrettyPrinter
クラス、 pformat()
関数、 pprint()
関数に、新規オプション compact が追加されました。これは出力方法を制御するもので、今のところのこれの True
での振舞いは、個々の (インデントされた) 行を width 幅で出来るだけ多くのシーケンスの要素が収まるように出力します。 (Contributed by Serhiy Storchaka in bpo-19132.)
長い文字列が Python の普通の行継続構文で折り返されるようになりました。 (Contributed by Antoine Pitrou in bpo-17150.)
pty¶
pty.spawn()
が None
ではなく os.waitpid()
からの戻り値から取ったステータス値を返すようになりました。 (Contributed by Gregory P. Smith.)
pydoc¶
pydoc
モジュールがイントロスペクション API inspect.signature()
に直接基くようになりました。これによりより幅広く callable オブジェクトのシグニチャ情報を提供出来るようになりました。この変更は、ヘルプ情報表示の際に __wrapped__
属性も考慮に入れられることも意味しています。(Contributed by Larry Hastings in bpo-19674.)
pydoc
モジュールはもはや既に束縛済みのメソッドでは self
パラメータを表示しません。それよりも、与えられた callable の正確な現在のシグニチャを常に表示しようとします。 (Contributed by Larry Hastings in bpo-20710.)
pydoc
に直接なされた変更に加え、背後の inspect
モジュールの改善が、カスタム __dir__
メソッドやさまざまなデスクリプタの扱いについての振る舞いの大幅な改善に寄与しました。
組み込み help()
は pydoc
モジュールに基いているので、上記変更は help()
の振る舞いにも影響します。
re¶
fullmatch()
関数と regex.fullmatch()
メソッドが追加されました。これはパターンを合致する文字列の両端に固定します。コード変更や既存の正規表現になにか代わりとなるものを追加したりする際に、末尾に $
を入れ忘れるといった類のバグは気付きにくいものです。これらの関数で、合致すべき終端をはっきり伝えることが出来ます。 (Contributed by Matthew Barnett in bpo-16203.)
正規表現オブジェクト の repr にパターンとフラグを含めるようになりました。 match オブジェクト の repr に start、end と合致した部分文字列を含むようになりました。 (Contributed by Hugo Lopes Tavares and Serhiy Storchaka in bpo-13592 and bpo-17087.)
resource¶
新規関数 prlimit()
は、指定プロセスのリソースリミットの問い合わせとセットを、一度の呼び出しで行えます。カーネルバージョン 2.6.36 以降で glibc 2.13 以降の Linux プラットフォームで利用可能です。 (Contributed by Christian Heimes in bpo-16595.)
Linux カーネル 2.6.36 以降のプラットフォームで、いくつかの Linux 固有の定数も追加されました: RLIMIT_MSGQUEUE
, RLIMIT_NICE
, RLIMIT_RTPRIO
, RLIMIT_RTTIME
, RLIMIT_SIGPENDING
. (Contributed by Christian Heimes in bpo-19324.)
FreeBSD バージョン 9 以降のプラットフォームで、いくつかの FreeBSD 固有の定数が追加されました: RLIMIT_SBSIZE
, RLIMIT_SWAP
, RLIMIT_NPTS
. (Contributed by Claudiu Popa in bpo-19343.)
select¶
epoll
がコンテキスト管理プロトコルをサポートするようになりました: with
ブロックで使うと close()
メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchaka in bpo-16488.)
devpoll
オブジェクトに、メソッド fileno()
とメソッド close()
、それに属性 closed
が追加されました。 (Contributed by Victor Stinner in bpo-18794.)
shelve¶
Shelf
がコンテキスト管理プロトコルをサポートするようになりました: with
ブロックで使うとブロックの終了時に自動的にクローズされます。 (Contributed by Filip Gruszczyński in bpo-13896.)
shutil¶
copyfile()
が、コピー元とコピー先が同じファイルの場合に Error
の限定されたサブクラスである SameFileError
を投げるようになりました。これにより、アプリケーションはこの特定のエラーでそれに相応しいアクションを取れます。 (Contributed by Atsuo Ishimoto and Hynek Schlawack in bpo-1492704.)
smtpd¶
SMTPServer
クラスと SMTPChannel
クラスが asynchat.async_chat
の map 引数に垂れ流すための map キーワード引数を受け取るようになりました。これでアプリケーションはグローバルなソケットマップを汚さずに済みます。 (Contributed by Vinay Sajip in bpo-11959.) (---訳注: 正確にはここでの変更は SMTPChannel は asynchat.async_chat.__init__(self, conn, map=map)
、SMTPServer は asyncore.dispatcher.__init__(self, map=map)
です。グローバルなソケットマップを汚さない、というのは SMTPServer
の方にだけその具体の意味が書かれていて、 map を指定しない場合は asyncore
のグローバルマップを使う、ということで、これが今回のこの変更前に無条件で行われていたことです。 changeset 84047:ed498f477549 参照。---)
smtplib¶
SMTPException
が OSError
のサブクラスになりました。これによって、とにかくエラーが起こったのだということにしか関心がないコードが、ソケット階層でのエラーと SMTP プロトコル階層の両エラーを一撃の try/except 文で捕捉出来るようになりました。 (Contributed by Ned Jackson Lovely in bpo-2118.)
socket¶
socket モジュールはそれをサポートしているプラットフォームで CAN_BCM
プロトコルをサポートするようになりました。 (Contributed by Brian Thorne in bpo-15359.)
ソケットオブジェクトで 継承可能フラグ を制御出来るようになりました。 get_inheritable()
で取得し、 set_inheritable()
でセットします。
定数値の socket.AF_*
と socket.SOCK_*
が、新規の enum
モジュールを使った列挙値になりました。つまりデバッグなどで魑魅魍魎な整数ではなく徳高い名前で表示されるということです。
AF_LINK
定数が BSD と OSX で利用可能になりました。
inet_pton()
と inet_ntop()
が Windows でサポートされるようになりました。 (Contributed by Atsuo Ishimoto in bpo-7171.)
sqlite3¶
connect()
関数に新規の真偽値パラメータ uri が追加されました。これを真にセットすると database パラメータを URI として解釈させることが出来ます。 (SQLite の URI のドキュメント を参照してください)。 (Contributed by poq in bpo-13773.)
ssl¶
PROTOCOL_TLSv1_1
と PROTOCOL_TLSv1_2
(TLSv1.1 と TLSv1.2 のサポート) が追加されました。これらプロトコルのサポートは Python が OpenSSL 1.0.1 以降とリンクしている場合にのみ利用可能です。 (Contributed by Michele Orrù and Antoine Pitrou in bpo-16692.)
新規関数 create_default_context()
は、互換性とセキュリティの間の程よいバランスとなるよう調整された SSLContext
を得るための標準手段として追加されました。それらの設定は SSLContext
コンストラクタが与えるデフォルトよりも厳しく、そして将来的にセキュリティにおけるベストプラクティスによる要請が変化すれば、事前予告なしで調整されるかもしれません。SSL をサポートする標準ライブラリの使用においての新しいベストプラクティスとして、 SSLContext
を得るのには create_default_context()
を使うことが推奨です。必要に応じ、対応する標準ライブラリ API の context 引数に渡すためにそれを使うよう修正してください。(Contributed by Christian Heimes in bpo-19689.)
SSLContext
のメソッド load_verify_locations()
にオプショナル引数 cadata が追加されました。これには PEM あるいは DER エンコードの証明書を直接指定できます。前者の場合は文字列で、後者では bytes-like object で指定します。(Contributed by Christian Heimes in bpo-18138.)
関数 get_default_verify_paths()
が追加されました。これは set_default_verify_paths()
メソッドが OpenSSL デフォルトの cafile
と capath
をセットするのに使うパスと環境変数から成る名前付きタプルを返します。デフォルトの検証にまつわる問題をデバッグするのに使えるでしょう。(Contributed by Christian Heimes in bpo-18143.)
SSLContext
の新規メソッド cert_store_stats()
はロードされた X.509
証明書、 X.509 CA
証明書、証明書失効リスト (crl
) を報告し、また、新規メソッド get_ca_certs()
はロードされた CA
証明書のリストを返します。(Contributed by Christian Heimes in bpo-18147.)
OpenSSL 0.9.8 以降が利用可能な場合に、 SSLContext
で属性 verify_flags
を指定出来るようになりました。これは証明書の検証プロセスをコントロールします。定数 VERIFY_DEFAULT
, VERIFY_CRL_CHECK_LEAF
, VERIFY_CRL_CHECK_CHAIN
, VERIFY_X509_STRICT
を組み合わせてセットします。OpenSSL は頼まない限りは証明書失効リスト(CRLs) の検証はしません。 (Contributed by Christien Heimes in bpo-8813.)
SSLContext
の新規メソッド load_default_certs()
は、プラットフォームによって異なるデフォルトの場所から “認証局” (CA=certification authority) 証明書ファイル一式をロードします。クライアントがサーバを検証するための TLS web サーバ証明の証明書をロード (purpose=
SERVER_AUTH
) することも、サーバがクライアント証明書を検証するのに用いる証明書をロード (purpose=
CLIENT_AUTH
) することも出来ます。(Contributed by Christian Heimes in bpo-19292.)
Windows だけで利用出来る関数が 2 つ追加されました。 enum_certificates()
と enum_crls()
で Windows のシステム証明書ストアから、証明書、証明書の情報、CRLs (certification revocation=証明書失効リスト) を抽出出来ます。(Contributed by Christian Heimes in bpo-17134.)
新規メソッド ssl.SSLContext.set_servername_callback()
によるサーバサイド SNI (Server Name Indication) サポートが追加されました。 (Contributed by Daniel Black in bpo-8109.)
SSLSocket.getpeercert()
が返す辞書に X509v3
拡張アイテムを含むようになりました: crlDistributionPoints
, caIssuers
, OCSP
URI。 (Contributed by Christian Heimes in bpo-18379.)
stat¶
stat
モジュールが C 実装 _stat
に基くようになりました。C 実装は、標準化されておらずプラットフォーム依存となる値のほとんどを取り込むために必要とされました。 (Contributed by Christian Heimes in bpo-11016.)
モジュールは新たに filemode()
フラグの S_IFDOOR
, S_IFPORT
, S_IFWHT
をサポートします。 (Contributed by Christian Hiemes in bpo-11016.)
struct¶
関数 iter_unpack
と、コンパイル済フォーマットでのメソッド struct.Struct.iter_unpack()
が追加されました。これは、与えられたデータフォーマットの繰り返しインスタンスを含むバッファを逐次的にアンパックします。 (Contributed by Antoine Pitrou in bpo-17804.)
subprocess¶
check_output()
が input 引数を受け付けるようになりました。これは実行するコマンドにとっての stdin
を供給するのに使われます (訳注: run()
のドキュメント参照)。 (Contributed by Zack Weinberg in bpo-16624.)
getstatus()
と getstatusoutput()
が Windows でも動作するようになりました。ただしこの変更は実際には、不注意で 3.3.4 に対して既に行われました。 (Contributed by Tim Golden in bpo-10197.)
sunau¶
getparams()
メソッドがプレインなタプルではなく namedtuple
を返すようになりました。 (Contributed by Claudiu Popa in bpo-18901.)
sunau.open()
がコンテキスト管理プロトコルをサポートするようになりました: with
ブロックで使うと戻り値オブジェクトの close
メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchaka in bpo-18878.)
24 ビットサンプルの出力をサポートしました。つまり AU_write.setsampwidth()
に 24 ビットに対応する値をセット出来ます。 (Contributed by Serhiy Storchaka in bpo-19261.)
writeframesraw()
メソッドと writeframes()
メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)
sys¶
新規関数 sys.getallocatedblocks()
は、現在インタプリタによりアロケートされているブロック数を返します (デフォルトの --with-pymalloc
設定での CPython では、これは PyObject_Malloc()
API によるアロケーションです)。これはメモリリークの追跡に、とりわけテストスイートで自動化されている場合はなおさら有用です。 (Contributed by Antoine Pitrou in bpo-13390.)
Python インタプリタが tut-interactive で開始する際に sys
モジュールの属性 __interactivehook__
をチェックするようになりました。この属性があると、対話モード開始直前にその設定値が引数なしで呼び出されます。このチェックは PYTHONSTARTUP
ファイルが読み込まれたあとで行われるので、そのファイル内でセット出来ます。 site
モジュールは readline
をサポートするプラットフォームではタブ補完と (~/.python-history
への) 履歴保存を有効にする関数を __interactivehook__ にセットします 。この (新たな) 振る舞いがお気に召さなければ、 PYTHONSTARTUP
, sitecustomize
, usercustomize
のいずれかで sys
からこの属性を削除 (あるいはほかのなにか callable をセット) してください。 (Contributed by Éric Araujo and Antoine Pitrou in bpo-5845.)
tarfile¶
tarfile
モジュールはスクリプトや直接 -m
で呼ばれた場合、簡単な コマンドラインインターフェイス をサポートするようになりました。
これにより tar ファイルアーカイブの作成や解凍が可能です。
(Contributed by Berker Peksag in bpo-13477.)
textwrap¶
TextWrapper
に 2 つ新しい制御変数が追加されていて、これらは属性値であり、コンストラクタ引数に渡せます。それぞれ max_lines
が最大出力行数、 placeholder
が max_lines により切り詰める場合に出力の最終行に置くテキストです。これら機能を使った新規のコンビニエンス関数 shorten()
が追加されています。これは入力に含まれる全ての空白文字を単一の空白に置き換え、また幅 width に収めて、切り詰める場合は末尾を placeholder (デフォルトで [...]
) で置き換えて、単一行で返します。(Contributed by Antoine Pitrou and Serhiy Storchaka in bpo-18585 and bpo-18725.)
threading¶
メインスレッドを表現する Thread
オブジェクトを、新規関数 main_thread()
で得られるようになりました。通常の条件であればこれは Python インタプリタを開始したスレッドになります。 (Contributed by Andrew Svetlov in bpo-18882.)
traceback¶
新規関数 traceback.clear_frames()
は、トレースバックオブジェクトを受け取って、それが参照している全てのフレーム内のローカル変数をクリアすることで、メモリ消費量を削減します。 (Contributed by Andrew Kuchling in bpo-1565525.)
types¶
新規デスクリプタ DynamicClassAttribute()
は、そのアクセスがインスタンスからの場合には普通に振舞いつつクラスからのアクセスでは クラス の __getattr__ メソッドに振り向ける属性、これを定義する手段を提供します。このことにより、インスタンス上ではアクティブなプロパティを持ち、クラス上では同名の仮想的属性を持つ、といったことが出来ます (Enum
がこれの実例になっています)。 (Contributed by Ethan Furman in bpo-19030.)
urllib¶
urllib.request
が新規クラス DataHandler
を介して data:
URL をサポートするようになりました。 (Contributed by Mathias Panzenböck in bpo-16423.)
Request
クラスで使われる HTTP メソッドを、サブクラスで method
属性をセットすることにより指定出来るようになりました。 (Contributed by Jason R Coombs in bpo-18978.) (---訳注: method
は 3.3 で追加されたが、コンストラクタに渡されたものが設定されるだけだった。---)
Request
オブジェクトは今では再利用可能です: full_url
あるいは data
属性などが変更されると、関連する全ての内部プロパティが更新されます。このことによって今や、例えば、 Request
オブジェクトを、異なる data 引数での OpenerDirector.open()
の複数回呼び出し内で使ったり、あるいは、まっさらから作り直すのではなく Request
の url
を書き換えて使ったり出来ます。新たに remove_header()
メソッドも追加されていて、これは Request
からヘッダを取り除きます。 (Contributed by Alexey Kachayev in bpo-16464, Daniel Wozniak in bpo-17485, and Damien Brecht and Senthil Kumaran in bpo-17272.)
HTTPError
オブジェクトに、エラーに関係する HTTP レスポンスヘッダへのアクセスを提供する headers
属性が追加されました。 (Contributed by Berker Peksag in bpo-15701.)
unittest¶
TestCase
クラスに新規コンテキストマネージャ subTest()
が追加されました。これは with
ブロックを「サブテスト化」するコンテキストマネージャを生成します。このコンテキストマネージャにより、テストメソッドで例えばループ内で subTest
コンテキストマネージャを呼び出すことで動的にサブテストを作れます。単一のテストメソッドでこれによる「個別に識別され」「個別にカウントされる」テスト群を不定数ぶん生成出来て、そしてそれらはいずれかが失敗したとしても全てが実行されます。例えば以下:
class NumbersTest(unittest.TestCase):
def test_even(self):
for i in range(6):
with self.subTest(i=i):
self.assertEqual(i % 2, 0)
これは 6 つのサブテストとなり、それぞれは unittest 内の冗長出力において、変数名 i
とその変数への個々の値 (i=0
, i=1
, など) からなるラベルで識別されます。この例の完全なバージョンが サブテストを利用して繰り返しテストの区別を付ける にあります。 (Contributed by Antoine Pitrou in bpo-16997.)
unittest.main()
の defaultTest に、テスト名からなるイテラブルを渡せるようになりました。以前は文字列で単一のテスト名を渡せるだけでした。 (Contributed by Jyrki Pulliainen in bpo-15132.)
テストディスカバリ最中に発生する SkipTest
(これはテストファイル内のモジュールレベルで起こせます) を、エラーとしてではなくスキップとして報告するようになりました。 (Contributed by Zach Ware in bpo-16935.)
discover()
が発見したファイルをソートするようになったので、一貫したテスト順でテスト出来ます。 (Contributed by Martin Melin and Jeff Ramnani in bpo-16709.)
TestSuite
がその実行完了次第すぐに、テスト成功していれば、テストへの参照を取り除くようになりました。ガーベージコレクションを行う Python インタプリタ上ではこの振る舞いによって、テストへの参照を保持しているものが他にない場合のテストのガーベージコレクトを可能にします。この振る舞いは TestSuite
をサブクラス化して何もしない _removeTestAtIndex
を定義することで上書き出来ます。 (Contributed by Tom Wardill, Matt McClure, and Andrew Svetlov in bpo-11798.)
テストアサーションの新規コンテキストマネージャ assertLogs()
が追加されました。これはコードブロックが logging
を使ってログメッセージを発行しているか確認します。デフォルトでは任意のロガーからの INFO
以上のプライオリティを持つメッセージを取れますが、ロガー名と最小プライオリティの両方とも指定可能です。コンテキストマネージャからの戻りオブジェクトに対して、ログされた LogRecord
とフォーマットされたメッセージの両方あるいはどちらかを問い合わせることが出来ます。 (Contributed by Antoine Pitrou in bpo-18937.)
テストディスカバリが名前空間パッケージで動作するようになりました。 (Contributed by Claudiu Popa in bpo-17457.)
unittest.mock
オブジェクトが、呼び出しが合致する際に仕様としてのシグニチャを検査するようになりました。これはつまり、以前は位置引数だけの合致だったものが、位置引数と名前の両方で合致できるようになったということです。(Contributed by Antoine Pitrou in bpo-17015.)
mock_open()
オブジェクトに readline
メソッドと readlines
メソッドが追加されました。 (Contributed by Toshio Kuratomi in bpo-17467.)
venv¶
venv
に csh
と fish
シェルの有効化スクリプトが追加されました。 (Contributed by Andrew Svetlov in bpo-15417.)
EnvBuilder
クラスとコンビニエンス関数 create()
が新規キーワード引数 with_pip を取るようになりました。デフォルトは False
です。これは EnvBuilder
が仮想環境に pip
がインストールされていることを保証するかどうかを制御します。(Contributed by Nick Coghlan in bpo-19552 as part of the PEP 453 implementation.)
wave¶
getparams()
メソッドがプレインなタプルではなく namedtuple
を返すようになりました。 (Contributed by Claudiu Popa in bpo-17487.)
wave.open()
がコンテキスト管理プロトコルをサポートするようになりました。 (Contributed by Claudiu Popa in bpo-17616.)
wave
は シーク不能なファイルへの書き出しが出来るように なりました。 (Contributed by David Jones, Guilherme Polo, and Serhiy Storchaka in bpo-5202.)
writeframesraw()
メソッドと writeframes()
メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)
weakref¶
新規 WeakMethod
クラスは、インスタンスメソッドへの弱参照をシミュレートします。 (Contributed by Antoine Pitrou in bpo-14631.)
新規クラス finalize
は、弱参照自身のライフサイクルを注意深く管理する必要性なしに、オブジェクトがガーベージコレクトされる際に呼び出されるコールバックを登録することを可能にします。 (Contributed by Richard Oudkerk in bpo-15528.)
ref
に関連付いたコールバック (あれば) を、新規属性 __callback__
で取得出来るようになりました。(Contributed by Mark Dickinson in bpo-17643.)
xml.etree¶
ノンブロッキングなアプリケーションでの XML ドキュメントの解析に、新規パーサ XMLPullParser
を利用出来ます。実例は 非ブロックパースのためのプル API をみてください。 (Contributed by Antoine Pitrou in bpo-17741.)
xml.etree.ElementTree
の関数 tostring()
、tostringlist()
と、 ElementTree
クラスの write()
メソッドに、 キーワード専用引数 の short_empty_elements が追加されました。これはコンテンツを持たない要素を省略形 (<tag />
) で書き出すか展開された形 (<tag></tag>
) で書き出すかを制御します。(Contributed by Ariel Poliak and Serhiy Storchaka in bpo-14377.)
zipfile¶
PyZipFile
クラスの writepy()
メソッドに filterfunc オプションが追加されました。これはアーカイブにどのディレクトリ・ファイルを加えるのかをコントロールするのに使うことが出来ます。例えばテスト用ファイルをアーカイブから除外する、などということが出来ます。(Contributed by Christian Tismer in bpo-19274.)
ZipFile
クラスと PyZipfile
クラスの allowZip64 パラメータのデフォルトが True
に変更されました。 (Contributed by William Mallard in bpo-17201.)
CPython の実装の変更¶
PEP 445: CPython のメモリアロケータのカスタマイズ¶
PEP 445 は、CPython インタープリタのメモリ割り当てをカスタマイズするために新たな C 水準のインターフェイスを追加しました。
参考
- PEP 445 -- Python メモリアロケータをカスタマイズするための新 API 追加
PEP written and implemented by Victor Stinner.
PEP 442: オブジェクトの安全なファイナライゼーション¶
PEP 442 は、 CPython でのオブジェクトのファイナライゼーションにまつわる現在の制限と奇癖を取り除きます。これによって、 __del__()
メソッドを持つオブジェクトと finally
節を持つジェネレータが、それらが循環参照に含まれる場合もファイナライズ出来ます。(---訳注: ジェネレータの例については bpo-17468 から派生した bpo-17807 での修正 changeset 83688:c89febab4648 の Lib/test/test_generators.py
に追加されたテスト参照。---)
この変更の一環で、モジュールのグローバルは、ほとんどのケースではインタプリタのシャットダウン中に強制的に None
がセットされることはなくなり、代わりに循環ガーベージコレクタの通常のオペレーションに委ねます。このことは、循環 GC が最初に導入されて以来悩みの種だった、普通 __del__
メソッドを巻き込んだ「インタプリタシャットダウン時エラーの類」全体を回避します。(---訳注: bpo-18214 (superseder for bpo-812369), changeset 84936:79e2f5bbc30c ---)
参考
- PEP 442 -- オブジェクトの安全なファイナライゼーション
PEP written and implemented by Antoine Pitrou.
PEP 456: 安全で取り換え可能なハッシュアルゴリズム¶
PEP 456 は、Python のハッシュアルゴリズムで行われた以前のセキュリティ修正作業 --- これは公に曝されている辞書検索に裏打ちされた API が標的になるかもしれない、特定の DOS 攻撃に対処するものです --- に追従するものです (この改善の現在ラウンドの事の起こりについては bpo-14621 を見てください)。この PEP では、 CPython のハッシュのコードをパッケージャが異なるハッシュアルゴリズムへの差し替えを容易にするために一元化し、そして Python のデフォルト実装としては 64 ビットデータ型を持つプラットフォームで SipHash に乗り換えます。以前の FNV アルゴリズムと比較したどんなパフォーマンスの差異も、些細なものです。
この PEP は sys.hash_info
名前付きタプルに、現在実行しているバイナリで使われているハッシュアルゴリズムを記述するためのフィールドを追加します。これら以外にはこの PEP が既存の CPython API を何か置き換えることはありません。
PEP 436: Argument Clinic¶
「Argument Clinic」(PEP 436) は CPython ビルドプロセスの新たな鍋の具です。ビルトインと標準ライブラリの拡張モジュールが C で実装されるにあたって、正確なシグニチャを定義し保守管理するプロセスを単純化するのに使えます。
Python 3.4 では既にいくつかの標準ライブラリ拡張モジュールが Argument Clinic を使うように変換されていて、またこれの結果として pydoc
と inspect
が更新されました。
Python 3.4 メンテナンスリリースでの更新の一部として C で実装されている callable に対して、プログラム的なイントロスペクションのためのシグニチャメタデータの追加が、さらに追加で行われることが期待されています。
注釈
Argument Clinic の PEP は、実装されている状態に対して完全には最新のものとはなっていません。Argument Clinic は Python 3.4 ではサードパーティに向けた公開 API として利用可能とする予定ではないので、このケースではリリース管理者とコア開発チームによって許容出来るとみなされました。
参考
- PEP 436 -- The Argument Clinic DSL (訳注: DSL=Domain-Specific Language)
PEP written and implemented by Larry Hastings.
その他のビルド並びに C API の変更¶
PyType_GetSlot()
関数が、安定 ABI に追加されました。これにより、制限 API を使う際に名前の付いた型のスロットから関数ポインタを取り出すことが出来ます。(Contributed by Martin von Löwis in bpo-17162.) (---訳注: 安定 ABI, 制限 API については What's New In Python 3.2 (PEP 384) を参照。---)初期化前処理 API の
Py_SetStandardStreamEncoding()
が追加されました。これにより CPython インタプリタを埋め込むアプリケーションは、標準ストリームに対して確実に特定のエンコーディングとエラーハンドラを使わせることが出来ます。(Contributed by Bastien Montagne and Nick Coghlan in bpo-16129.)文字列引数を変更することのない Python C API のほとんどが、
char *
ではなく適切にconst char *
として宣言されました。 (Contributed by Serhiy Storchaka in bpo-1772673.)Python インタプリタが利用出来ない場合 (例えばクロスコンパイルのシナリオ) であっても使える、シェルで書き直したバージョンの
python-config
が追加されました。PyUnicode_FromFormat()
が%s
,%A
,%U
,%V
,%S
,%R
についての幅と精度の指定をサポートするようになりました。 (Contributed by Ysj Ray and Victor Stinner in bpo-7330.)既存の
PyStructSequence_InitType()
関数を補うものとして、PyStructSequence_InitType2()
が追加されました。違いは、これは成功時に0
、失敗時に-1
を返すことです。CPython のソースを、最近の GCC と clang のアドレスサニティチェック機能を使ってコンパイル出来るようにしました: 小さなオブジェクト用アロケータで起こっていた偽の警報を黙らせました。 (Contributed by Dhiru Kholia in bpo-18596.)
Windows ビルドに アドレス空間配置のランダム化 と データ実行防止 を使うようにしました。 (Contributed by Christian Heimes in bpo-16632.)
operator.length_hint()
と等価な C API 関数PyObject_LengthHint()
が追加されました。 (Contributed by Armin Ronacher in bpo-16148.)
その他の改善¶
python コマンドに新規 オプション の
-l
が追加されました。これは「隔離モード (isolated mode)」で Python を実行します。これが意味するのは、sys.path
がスクリプトディレクトリもユーザのsite-packages
ディレクトリも含まず、また、全てのPYTHON*
環境変数が無視される、というものです (ので暗黙で-s
と-E
を含んでいるということです)。ほかの制限についても将来適用されるでしょう。その目標はユーザ環境からスクリプト実行を隔離することです。例えばこれは Python がシステムスクリプトとして実行される場合に適切なものです。ほとんどの POSIX システムではシステムスクリプトの#!
行で指定できますし、そうすべきです。(Contributed by Christian Heimes in bpo-16499.)readline
をサポートするプラットフォームで、対話インタプリタでの Tab キーでの補完がデフォルトで有効になりました。履歴もデフォルトで有効となり、~/.python-history
に書き込まれ (そしてそこから読み込まれ) ます。 (Contributed by Antoine Pitrou and Éric Araujo in bpo-5845.)Python インタプリタの
--version
での起動時、標準エラーではなく標準出力にバージョン情報を出力するようになりました (bpo-18338)。同じ変更はargparse
モジュールに対して (bpo-18920)、また、スクリプトとして呼び出せる機能を持つモジュールに対して (bpo-18922) も行われました。CPython の Windows インストーラが、拡張子を登録する際に
PATHEXT
に.py
を追加するようになりました。これをするとユーザは、 Windows コマンドプロンプトから Python スクリプトを、.py
拡張子なしでその名前だけタイプして実行出来ます。 (Contributed by Paul Moore in bpo-18569.)新たな
make
ターゲットの coverage-report の追加。これは python をビルドし、テストスイートを実行し、gcov
と lcov を用いて C 言語のコードベースのカバレッジレポートを HTML で生成します。python 回帰テストスイート への
-R
オプションが、sys.getallocatedblocks()
を使ったメモリアロケーションのリークもチェックするようになりました。(Contributed by Antoine Pitrou in bpo-13390.) (---訳注: リファレンスマニュアルにオプション説明はないので、 python -m test --help を参照して下さい。---)python -m
が名前空間パッケージで動くようになりました。stat
モジュールが C で実装されました。これは以前問題であった Python モジュール内で値をハードコードすることなく、定数を C ヘッダファイルから取りこめることを意味しています。(---訳注: bpo-11016 、特に msg127114 以降参照。---)単一の OS モジュール (POSIX の
.so
と Windows の.dll
) からの複数 Python モジュールのロードを正しく行えるようになりました (以前は黙ってファイル内の最初のモジュールだけが返されていました)。 (Contributed by Václav Šmilauer in bpo-16421.)新しい命令コード
LOAD_CLASSDEREF
が追加されました。これは __prepare__ のある種の使い方で起こりうる、クラス本体内の自由変数のロードでのバグを修正するために導入されました。(Contributed by Benjamin Peterson in bpo-17853.)Victor Stinner が、彼の PEP 445 ベースの
pyfailmalloc
ツールを用いて数多くのメモリエラー関連のクラッシュを特定し、そして修正しました。 (bpo-18408, bpo-18520)pyvenv
コマンドに、シンボリックリンクがデフォルトのシステムでもそうせずにコピーを使うようにするための--copies
オプションが追加されました。 (Contributed by Vinay Sajip in bpo-18807.)pyvenv
コマンドにはさらに、そうしなければ自動的に仮想環境に pip がブートストラップされてしまうのを抑制するための、--without-pip
オプションが追加されました。(Contributed by Nick Coghlan in bpo-19552 as part of the PEP 453 implementation.)環境変数
PYTHONIOENCODING
の値内で、エンコーディング名を省略出来るようになりました。つまり、デフォルトエンコーディングを変更することなしにエラーハンドラだけをセット出来ます。 (Contributed by Serhiy Storchaka in bpo-18818.)bz2
、lzma
、gzip
モジュールのopen
関数がx
(排他的作成) モードをサポートするようになりました。 (Contributed by Tim Heaney and Vajrasky Kok in bpo-19201, bpo-19222, and bpo-19223.)
大幅な最適化¶
UTF-32 デコーダが3-4倍速くなりました。 (Contributed by Serhiy Storchaka in bpo-14625.)
集合に対するハッシュ衝突のコストが削減されました。ハッシュテーブルの個々の検査 (probe) で、ハッシュテーブル全体を通したランダムな検査を行う前に、連続する隣接したキー/ハッシュペアをチェックするようになりました。これは、キャッシュ局所性を利用して衝突解決のコストを減らします。この衝突解決戦略は、リニア検査とオープンアドレッシング法のハイブリッドとして説明できます。追加的なリニア検査の数はデフォルトでは 9 です。この値は、コンパイル時に LINEAR_PROBES を定義することで任意の値に変更できます。リニア検査を完全に無効にするには LINEAR_PROBES=0 を設定してください。 (Contributed by Raymond Hettinger in bpo-18771.)
インタプリタの起動が約 30% 高速化されました。この速度向上は、いくつかの手段によってもたらされました。インタプリタは起動時により少数のモジュールをロードするようになりました。例えば
re
,collections
,locale
モジュール、およびそれらの依存モジュールは、デフォルトではインポートされません。 marshal モジュールは、コンパイルされた Python コードをより高速にロードできるように改善されました。 (Contributed by Antoine Pitrou, Christian Heimes and Victor Stinner in bpo-19219, bpo-19218, bpo-19209, bpo-19205 and bpo-9548.)bz2.BZ2File
が大半の場合 Python2 のバージョン以上に速くなりました。lzma.LZMAFile
も最適化されました。(Contributed by Serhiy Storchaka and Nadeem Vawda in bpo-16034.)random.getrandbits()
が (通常使用される) 小さな整数に対して20%-40% 早くなりました。 (Contributed by Serhiy Storchaka in bpo-16674.)文字列のストレージ形式を変更したことにより、文字列のピックル化は非常に速くなりました。(Contributed by Victor Stinner and Antoine Pitrou in bpo-15596.)
io.FileIO.readall()
の性能問題が解決されました。これは特に Windows に影響し、subprocess
を通して大量のデータをパイプで渡しているケースでかなり速度向上します。 (Contributed by Richard Oudkerk in bpo-15758.)html.escape()
が10倍速くなりました。(Contributed by Matt Bryant in bpo-18020.)Windows において、
obmalloc
で CRT のmalloc
の代わりにネイティブのVirtualAlloc
を使うようになりました。人工的なベンチマーク結果は、メモリー消費が 3% 減ったことを示しています。os.urandom()
は、複数のスレッドから並行して実行された時に多数のファイル記述子が使われることを避けるために、遅延オープンされる永続的なファイル記述子を使うようになりました。 (Contributed by Antoine Pitrou in bpo-18756.)
非推奨¶
このセクションでは、Python 3.4 で非推奨となり Python 3.5 以降で削除予定となる、様々な API とその他機能性についてをカバーします。(全てではありませんが) ほとんどのケースで、非推奨に対する警告を (たとえば -Wd
を使って) 有効にしたインタプリタ起動時、非推奨 API を使うと DeprecationWarning
を励起します。
Python API の非推奨項目¶
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
モジュールが撤廃保留中で、Python 3.6 での削除が計画されています。hmac.new()
関数の digestmod がデフォルトで暗黙にMD5
を使う仕様は撤廃されます。Python 3.6 では digestmod 引数には明示的にダイジェスト名かコンストラクタを渡すことが求められます。ftplib
モジュール内の内部クラスNetrc
はずっと長いことそのドキュメンテーション文字列内で非推奨であることを謳ってきました。これは今やDeprecationWarning
を発行します。Python 3.5 ではこのクラスは完全に削除されます。subprocess.Popen.wait()
の文書化されていない引数 endtime は本来曝してはいけないものでしたので、使用されていないことを願っています。これは非推奨ですし、確実に Python 3.5 では削除されるのではないでしょうか。(---訳注: 3.5 では削除はされませんでしたが、もちろん使用しないでください。これは内部用です。---)HTMLParser
の strict 引数は非推奨です。plistlib
モジュールに追加されたload()
,dump()
,loads()
,dumps()
により、対応するreadPlist()
,writePlist()
,readPlistFromBytes()
,writePlistToBytes()
が非推奨となりました。同じく単にbytes
コンストラクタを使えば良いのでData()
が非推奨となりました。sysconfig
のキーSO
は非推奨です。これはEXT_SUFFIX
に取って代わられました。種々の
open
関数で受け付けられていたU
モードは非推奨となりました。Python 3 ではこれは何も役に立つことはしません。io.TextIOWrapper
(必要ならば)、 newline 引数を適切に使うことによって置き換えられるはずです。xml.etree.ElementTree.iterparse()
の parser 引数とXMLParser()
の html 引数が非推奨となりました。後者は (訳注: 第一引数のため) 削除に備えてXMLParser
への全ての引数はキーワード引数として渡すようにしてください。
非推奨の機能¶
削除¶
サポートされなくなったオペレーティングシステム¶
以下の OS 向けのソースとビルドツールは削除されました。
OS/2 (bpo-16135)。
Windows 2000 (changeset e52df05b496a)。
COMSPEC
がcommand.com
を指している Windows システム (bpo-14470).VMS (bpo-16136)。
API と機能の削除¶
時代遅れとなり、以前に既に非推奨となった以下の API と機能が削除されました:
保守されていなかった
Misc/TextMate
とMisc/vim
ディレクトリは削除されました (代わりに何が使えるかの提案は devguide をみてください --- 訳注: おそらく Additional Resources に挙げられている wiki を指している ---)。makefile のマクロ
SO
は削除されました (これはSHLIB_SUFFIX
マクロとEXT_SUFFIX
マクロで置き換えられました) (bpo-16754)。PyThreadState.tick_counter
フィールドは削除されました。これは Python 3.2 で「新しい GIL」が導入された際に意味をなくしていました。 (bpo-19199).PyLoader
とPyPycLoader
がimportlib
から削除されました。 (Contributed by Taras Lyapun in bpo-15641.)HTTPConnection
とHTTPSConnection
の strict 引数は削除されました。 HTTP 0.9 スタイルの 「Simple Responses」はもはやサポートされません。urllib.request.Request
の非推奨となっていた getter/setter メソッドのadd_data
,has_data
,get_data
,get_type
,get_host
,get_selector
,set_proxy
,get_origin_req_host
,is_unverifiable
は削除されました (代わりに属性アクセスを直接使ってください)。非推奨の
TYPE_INT64
ロードのサポートがmarshal
から削除されました。 (Contributed by Dan Riti in bpo-15480.)inspect.Signature
: 位置専用パラメータを示すのに今では正当な名前が必要です。object 自身の
object.__format__()
はもはや空でないフォーマット文字列を受け付けず、TypeError
を投げます。空でない文字列を渡すことは既に Python 3.2 で非推奨となっていました。この変更は以前は動作した (そして正しくない) コードが、オブジェクトが __format__ メソッドを得ることで処理に失敗し始めていた状況を防ぐ目的でなされました。この変更が意味することはあなたのコードにとって、それを処理する __format__ メソッドを持たないオブジェクトにs
フォーマットコードを使うとTypeError
を起こしうるようになった、ということです。背景については bpo-7994 を参照して下さい。 (---訳注: このパラグラフの中盤が非常にわかりにくい表現で訳者も意味を取りきれていませんが、おそらく Python 2.6/3.0 で動作していた例えばformat(1+1j, '10s')
が Python 2.7/3.1 で動作しなくなったことを指しているのだと思います。問題にされているのは動作しなくなったことではなくてむしろ動作していたことで、そして object.__format__ が return str(self).__format__(fmt) で実現されていること。このコードでは fmt は何らの意味も持っていませんので、これは一貫性に欠ける要因である、とのことで、「わかりやすく拒絶する」ことが真意であるようです ---)Python 3.2 で非推奨となった
difflib.SequenceMatcher.isbjunk()
およびdifflib.SequenceMatcher.isbpopular()
は削除されました: sm がSequenceMatcher
であるとして、x in sm.bjunk
とx in sm.bpopular
を使うようにしてください。 (bpo-13248)
コードの整理¶
Python 3.4 への移植¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
'python' コマンドの挙動の変更¶
POSIX シェルでは、環境変数
PATH
に空の値をセットすることは、何もセットしないことと同じです。ところがPYTHONPATH
に空の値をセットすることは、何もセットしないことと まったく同じではありませんでした:PYTHONPATH
に空の値をセットすると、.
をセットしたのと同じ意味になっていて、これはPATH
での振舞いから類推しようとすると混乱を招くものでした。この振る舞いはPATH
での POSIX の慣習に従うように改められました。CPython インタプリタのデバッグビルド (
--with-pydebug
) での出力 [X refs, Y blocks] がデフォルトではオフになりました。-X showrefcount
オプション起動で再度有効に出来ます。 (Contributed by Ezio Melotti in bpo-17323.)python コマンドとほとんどの標準ライブラリスクリプト (また
argparse
も) において、--version
が情報出力をstderr
ではなくstdout
に行うようになりました (issue へのリンクは その他の改善 セクション内参照)。
Python API の変更¶
importlib.abc
内に定義されている ABC は、無分別にNotImplementedError
を投げるのではなく、相応しい例外を投げるかデフォルト値を返すかのどちらかになりました。このことはsuper()
を呼び出して ABC がするがままに任せているコードにのみ影響します。互換性のために、必要であればNotImplementedError
とその投げられる新たな例外の両方を捕捉してください。モジュール型が
__package__
属性と__loader__
属性をデフォルトでNone
で初期化するようになりました。これら属性がセットされたかどうかを後方互換性のある方法で調べるには、たとえばgetattr(module, '__loader__', None) is not None
のようにしてください。 (bpo-17115.)importlib.util.module_for_loader()
がリロードを適切にサポートするために、__loader__
と__package__
を無条件にセットするようになりました。これが望む振る舞いでないならば、これら属性を手動でセットする必要があるでしょう。モジュールの管理にはimportlib.util.module_to_load()
を使うことが出来ます。(---訳注: 最後の「You can useimportlib.util.module_to_load()
for module management.」が意味不明。モジュールのプライベート_module_to_load
がコンテキストマネージャとして定義されているので、それのことかもしれません。---)インポートがリロードの際に無条件に関連属性 (例えば
__name__
,__loader__
,__package__
,__file__
,__cached__
) をリセットするようになりました。これは、3.3 以前のリロードの際にモジュールを再発見する振る舞いと同じものを復元するものであるということを注記しておきます。 (bpo-19413)凍結パッケージ (frozen package) はもはや
__path__
にパッケージ名を含むリストをセットせず、空リストをセットします。この以前の振る舞いは、凍結パッケージと同じ名前を持つディレクトリが存在する場合のサブモジュールのインポートで、インポートシステムが間違ったことを起こしうるものでした。モジュールがパッケージなのかそうでないのかを決める正しい方法は、hasattr(module, '__path__')
を使うことです。 (bpo-18065)凍結モジュール (frozen module) はもはや
__file__
属性を定義しません。それらはどこかはっきりとした場所からロードされたのではないのですから、凍結モジュールにこの属性をセットすることは、意味的に間違っているのです。モジュールが凍結コード由来であることを知る必要があれば、モジュールの__spec__.location
に'frozen'
がセットされているかどうかでわかりますし、ローダがimportlib.machinery.FrozenImporter
のサブクラスかどうかをチェックするか、Python 2 との互換性が必要であれば、imp.is_frozen()
が使えます。py_compile.compile()
が書き込み先ファイルパスがシンボリックリンクか非レギュラーファイルの場合にFileExistsError
を投げるようになりました。これは、警告の役割を果たすためです、インポートがファイルパスの元のファイルタイプが何かによらずに、それらファイルをレギュラーファイルで上書きすることの。ソースコードをロードしようとして
SyntaxError
かもしくはUnicodeDecodeError
を引き起こした場合に、importlib.abc.SourceLoader.get_source()
はそれをImportError
に読み替えて投げることをしなくなりました。ImportError
はそうあるべきなのに見つからない場合にのみ投げられるべきなので、ソースコードが見つかったけれども正しくない構造である場合の意味にまで及ぶのは、手を伸ばし過ぎで過負荷です。ImportError を捕捉していたコードで今後とも構文エラーとデコーディングの問題を無視したいと望むならば、これら 3 つ全ての例外を捕捉するようにしてください。 (訳注: changeset 84172:e353f64dfd95 )functools.update_wrapper()
とfunctools.wraps()
が、たとえその関数も__wrapped__
を持っていたとしても正しくその関数が包まれるように__wrapped__
属性値をセットするようになりました。つまり__wrapped__
属性は、以前のようにチェイン内の全ての__wrapped__
属性が最も内側の関数を参照するのではなく、デコレートされた関数の積み上げを正しくリンクするようになったということです。以前の振る舞いが意図されたものであると思い込んでいたイントロスペクションライブラリの作者は、チェインの中の最初の関数 (__wrapped__
属性を持たない) にアクセスするのにinspect.unwrap()
を使えます。(---訳注: bpo-17482. わかりにくいので実例で。中で適切に @wrap を使うデコレータ @deco1、@deco2 があるとして、my_func をこの両方でデコレートするとします。この場合に、Python 3.3 まではmy_func.__wrapped__.__wrapped__
が AttributeError になります。今回のこの修正でmy_func.__wrapped__.__wrapped__
は期待通りに振舞います。 ---)inspect.getfullargspec()
は、inspect.signature()
を前提とした再実装がなされました。これにより、かつて扱えていたよりも遥かに広い種類の呼び出し可能 (callable) を扱うようになりました (訳注: 例えばopen()
などは Python 3.3 までは扱えなかった)。Python 3.4 系列の経過のなかで、追加で組み込みや拡張モジュールの callable がシグニチャのメタデータを持つことが期待されています。inspect.getfullargspec()
が非 Python callable で失敗することを前提としたコードは、適宜調整の必要があるかもしれません。importlib.machinery.PathFinder
はsys.path_hooks
内のオブジェクトに、空文字列の場合は現在作業ディレクトリを渡すようになりました。結果のsys.path_importer_cache
が決して''
を含まないことになるので、sys.path
に基いてsys.path_importer_cache
を巡回しても全てのキーを見つけられません。インタプリタを-m
で起動した場合も含め、現在作業ディレクトリ内でインポートされた際のモジュールの__file__
も絶対パスで持つようになりました (ただしスクリプトがコマンドラインから相対パスを使って直接実行された際の__main__.__file__
を除きます (Contributed by Brett Cannon in bpo-18416))。 (bpo-18416)HTTPConnection
とHTTPSConnection
から strict 引数が削除されたことは、残りの引数をキーワード引数としてではなく位置引数として使っていたなら意味が変わってしまいます。非推奨警告に注意を払ってきたのであれば、あなたのコードは既に全てのオプショナル引数をキーワードで渡しているはずです。from __future__ import ...
ステートメントの間に文字列が含まれる場合に 常にSyntaxError
となるようになりました。以前はモジュールの docstring が先頭にある場合とない場合で振る舞いが違っていて、ない場合にこのエラーが意図せず無視される場合がありました。この修正は CPython を言語仕様に準拠させるものです。Jython と PyPy では既にこれが行われています。 (bpo-17434)ssl.SSLSocket.getpeercert()
とssl.SSLSocket.do_handshake()
は、SSLSocket
が未接続時に以前はAttributeError
を投げていましたが、ENOTCONN
を持ったOSError
を投げるように改められました。加えてgetpeercert()
はハンドシェイクが未実施の場合にValueError
を投げるようになりました。base64.b32decode()
が入力文字列が非 b32 文字を含む場合にTypeError
ではなくbinascii.Error
を投げるようになりました。今回のこのTypeError
はほか (訳注: if the input is incorrectly padded のとき) のTypeError
が置き換えられた際に置き換え忘れられたものでした。 (Contributed by Serhiy Storchaka in bpo-18011.) 注意: この修正は後方互換性を保てないので本来メンテナンスリリースの Python 3.3 には入るべきではなかったのですが、不注意で Python 3.3.3 にも行われてしまいました。file
属性がcgi.FieldStorage
インスタンスがガーベージコレクトされる際に自動的にクローズされるようになりました。FieldStorage インスタンスを生き永らえさせずにそのファイルオブジェクトをcgi.FieldStorage
から切り離して取り出していたなら、cgi.FieldStorage
インスタンス全体を記憶しておくか、あるいはcgi.FieldStorage
インスタンスがガーベージコレクトされる前にファイル内容を読み込んでおくかしてください。クローズ済みの SSL ソケットに対する
read
やwrite
呼び出しで、以前のようなミステリアスなAttributeError
ではなく、役に立つValueError
を投げるようになりました。 (bpo-9177)slice.indices()
が巨大な値でOverflowError
を起こすことはなくなりました。この修正からの流れでslice.indices()
は負の値に対してValueError
を投げるようになっています。以前はこれは馬鹿げた値を返していました。 (bpo-14794)特殊メソッド
__complex__
が複素数ではなくfloat
を返す実装をしているオブジェクトを渡すとcmath
関数ではエラーとなり、complex
コンストラクタでは受け容れられていましたが、これはいずれもTypeError
となるように改められました。(bpo-16290.)3.2 と 3.3 での
int
コンストラクタが base パラメータとして誤ってfloat
を許容してしまっていました。それをわざわざやっているとも思えないですが、そうしていたなら今後はTypeError
になります。 (bpo-16772)キーワード専用引数へのデフォルト値が、通常のキーワード引数へのデフォルト値評価の あとで 評価されるようになりました。前ではなく。望むらくは誰一人以前のバギーな振る舞いに頼っちゃうおバカなコードを書いていませんように。願います。 (bpo-16967)
古いスレッド状態が
fork()
後にクリアされるようになりました。これにより、以前は不適切に永遠に生き残ってしまっていたいくつかのシステムリソース (たとえば、スレッドローカル記憶内に維持されたデータベース接続) が解放されるようになります。 (bpo-17094.)__annotations__
辞書内のパラメータ名が__kwdefaults__
と同じように適切にマングル化されるようになりました。 (Contributed by Yury Selivanov in bpo-20625.)hashlib.hash.name
が識別子を常に小文字で返すようになりました。以前はいくつかの組み込みハッシュが大文字名を持っていましたが、公式インターフェイスであることから、命名に一貫性を持たせるようにしました。 (bpo-18532)unittest.TestSuite
がその実行後にテストへの参照を取り除くようになったので、テスト集合を再実行するのにTestSuite
を再利用してテストをまとめあげていると、テスト失敗するかもしれません。テストスイートはそのような方法で再利用すべきではありません。そのようなことをすればテスト実行間で状態が残ってしまうので、unittest
設計の狙いであるテストの独立性を破壊してしまいます。とはいえ、独立性の欠如を受け容れてもいいと思うのであれば、TestSuite
をサブクラス化して何もしない_removeTestAtIndex
を定義することで、古い振る舞いは復元出来ます (TestSuite.__iter__()
参照)。 (bpo-11798)unittest
がコマンドライン解析にargparse
を使うようになりました。このことで、以前は動作していた不当なコマンド形式で許されなくなったものがあります。理屈から言えばこれは後方互換性の問題ではないはずです。許されなくなったコマンド形式は意味をなしていなかったものですから、使われていたとは思えません。関数
re.split()
,re.findall()
,re.sub()
と、match
オブジェクトのメソッドgroup()
,groups()
は、操作対象が bytes-like object である場合に常に bytes オブジェクトを返すようになりました。以前は戻り値型は入力型に合わせられていました。戻り値の型がたとえばbytearray
になることに依存していたのであれば、コードを修正する必要があります。audioop
関数が文字列を入力として渡すと即座にエラーを投げるようにしました。以前は不規則に後々の処理でようやく失敗していました。 (bpo-16685)HTMLParser
の新規引数 convert_charrefs は現在は後方互換性維持のためにFalse
をデフォルトとしていますが、最終的にはTrue
がデフォルトになります。あなたのコードではHTMLParser
の全ての呼び出しでこれをキーワード引数として明示することをお勧めします。 (bpo-13633)hmac.new()
関数の digestmod 引数からデフォルト値が消える予定です。ので、hmac.new()
呼び出しは常に digestmod を明示するように修正すべきです。 (bpo-17276)sysconfig.get_config_var()
にキーSO
を渡すこととsysconfig.get_config_vars()
の呼び出し結果からSO
キーを探すことは非推奨です。このキーは文脈依存のEXT_SUFFIX
またはSHLIB_SUFFIX
で置き換えられるべきです。 (bpo-19555)open
系関数にモードU
を使っていたコードは修正すべきです。U
は Python 3 では無力であり、いずれはこれの使用は例外を投げるようになる予定です。使う関数に依存しますが、 newline 引数を使うか、あるいは必要であればストリームをTextIOWrapper
でラップしてその newline 引数を使うことで、その古い Python 2 の振る舞いと同等なものを実現出来ます。 (bpo-15204)スクリプト内から
pyvenv
を使っていて、pip がインストール されない ことを望むならば、コマンド呼び出しに--without-pip
を追加しなければなりません。indent を明示した場合の
json.dump()
とjson.dumps()
のデフォルトの振る舞いが変更されました。要素を区切るカンマが行末に来る場合の後ろに、空白を追加しなくなりました。これはその出力のテストを空白に繊細な比較をすることで行っている場合にだけ問題になります。 (bpo-16333)doctest
が拡張モジュールの__doc__
文字列から doctest を見つけるようになったので、doctest のテストディスカバリが拡張モジュールを含んでいてその中で doctest のようにみえるものが含まれていると、テスト実行時にこれまで見かけたことのないテスト失敗を目にするかもしれません。 (bpo-3158)collections.abc
モジュールが、Python スタートアップの改善の一環で少々リファクタリングが行われました。これの結果としてcollections
は自動でcollections.abc
をインポートしなくなりました。もしもこの (文書化されていなかった) 暗黙でのインポートに依存していたのであれば、import collections.abc
として明示的にインポートを追加する必要があります。 (bpo-20784)
C API の変更¶
いくつかの内部 C API とともに
PyEval_EvalFrameEx()
,PyObject_Repr()
,PyObject_Str()
に、現在アクティブな例外を黙殺する状況で使われていないことを確かにするためのデバッグアサーションが仕込まれました。アクティブな例外を捨てることが期待されて望ましいケース (たとえば、既にローカルにPyErr_Fetch()
で保存済みであるとか、異なる例外に置き換えることが意図である場合) は、アサーション有効でコンパイルされている Python バージョンで実行して、(直接的・間接的によらず) それら操作呼び出しがそのアサーションを発行するのを、明示的にPyErr_Clear()
呼び出しをすることで潰してください。PyErr_SetImportError()
が msg がセットされていない場合にTypeError
をセットするようになりました。以前は例外をセットすることなくNULL
を返すだけでした。PyOS_ReadlineFunctionPointer
コールバックは、エラー時にNULL
を返すかPyMem_RawMalloc()
またはPyMem_RawRealloc()
でアロケートした文字列を返さなければなりません。PyMem_Malloc()
やPyMem_Realloc()
でアロケートした文字列はダメです。 (bpo-16742)PyThread_set_key_value()
が必ず値をセットするようになりました。Python 3.3 ではこの関数はキーが既存 (で現在値がNULL
ポインタでない) の場合には何もしませんでした。PyFrameObject
構造体のフィールドf_tstate
(thread state) が、バグをフィックスするために削除されました: 論拠については bpo-14432 を参照してください。
3.4.3 の変更¶
PEP 476: stdlib http クライアントが証明書の検証を行うのをデフォルトで有効化¶
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)