Python3.3の新機能
この記事では、Python3.3の新機能を3.2と比較して説明します。 Python3.3は2012年9月29日にリリースされました。 詳細については、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
新しいライブラリモジュール:
- faulthandler (低レベルのクラッシュのデバッグに役立ちます)
- ipaddress (IPアドレスとマスクを表す高レベルのオブジェクト)
- lzma (XZ / LZMAアルゴリズムを使用してデータを圧縮します)
- unittest.mock (テスト対象のシステムの一部をモックオブジェクトに置き換えます)
- venv (Python 仮想環境、人気のある
virtualenv
パッケージのように)
新しい組み込み機能:
- I / O例外階層を作り直しました。
実装の改善:
- importlib に基づいて importmachinery を書き直しました。
- よりコンパクトな Unicode文字列。
- よりコンパクトな属性辞書。
大幅に改善されたライブラリモジュール:
セキュリティの改善:
- ハッシュのランダム化はデフォルトでオンになっています。
ユーザー向けの変更の包括的なリストについては、以下をお読みください。
PEP 405:仮想環境
仮想環境は、メンテナンスを容易にするために、システム全体の基本インストールを共有しながら、個別のPythonセットアップを作成するのに役立ちます。 仮想環境には、独自のプライベートサイトパッケージのセットがあります(つまり、 ローカルにインストールされたライブラリ)、およびオプションでシステム全体のサイトパッケージから分離されます。 それらの概念と実装は、人気のあるvirtualenv
サードパーティパッケージに触発されていますが、インタプリタコアとの緊密な統合の恩恵を受けています。
このPEPは、プログラムによるアクセス用の venv モジュールと、コマンドラインアクセスおよび管理用のpyvenv
スクリプトを追加します。 Pythonインタープリターは、pyvenv.cfg
ファイルをチェックします。このファイルの存在は、仮想環境のディレクトリツリーのベースを示します。
PEP 420:暗黙の名前空間パッケージ
__init__.py
マーカーファイルを必要とせず、複数のパスセグメントに自動的にまたがることができるパッケージディレクトリのネイティブサポート( PEP 420で説明されているように、名前空間パッケージへのさまざまなサードパーティのアプローチに触発されています)
PEP 3118:新しいmemoryviewの実装とバッファプロトコルのドキュメント
PEP 3118 の実装が大幅に改善されました。
新しいmemoryview実装は、複数のクラッシュレポートにつながるPy_buffer構造体の動的に割り当てられたフィールドのすべての所有権と有効期間の問題を包括的に修正します。 さらに、非連続または多次元入力に対してクラッシュまたは誤った結果を返すいくつかの関数が修正されました。
memoryviewオブジェクトには、コンシューマーの要求タイプをチェックするPEP-3118準拠のgetbufferproc()が含まれるようになりました。 多くの新機能が追加されました。それらのほとんどは、非連続配列およびサブオフセットのある配列に対して完全に一般的に機能します。
ドキュメントが更新され、輸出者と消費者の両方の責任が明確に説明されています。 バッファ要求フラグは、基本フラグと複合フラグにグループ化されます。 非連続で多次元のNumPyスタイルの配列のメモリレイアウトについて説明します。
特徴
- 構造体モジュール構文のすべてのネイティブ単一文字フォーマット指定子(オプションで接頭辞「@」)がサポートされるようになりました。
- いくつかの制限がありますが、cast()メソッドでは、C連続配列の形式と形状を変更できます。
- 多次元リスト表現は、すべての配列タイプでサポートされています。
- 多次元比較は、すべての配列タイプでサポートされています。
- フォーマットB、b、またはcのハッシュ可能な(読み取り専用)タイプの1次元メモリビューがハッシュ可能になりました。 (:issue: `13411` のAntoinePitrouによる寄稿。)
- 任意の1-D配列タイプの任意のスライスがサポートされています。 たとえば、負のステップを使用して、O(1)のメモリビューを反転できるようになりました。
APIの変更
- 次元の最大数は公式には64に制限されています。
- 空の形状、ストライド、およびサブオフセットの表現は、
None
ではなく空のタプルになりました。 - フォーマット 'B'(符号なしバイト)でmemoryview要素にアクセスすると、整数が返されるようになりました(structモジュール構文に従って)。 バイトオブジェクトを返すには、最初にビューを「c」にキャストする必要があります。
- memoryviewの比較では、オペランドの論理構造を使用し、すべての配列要素を値で比較するようになりました。 構造体モジュール構文のすべてのフォーマット文字列がサポートされています。 認識されないフォーマット文字列を含むビューは引き続き許可されますが、ビューの内容に関係なく、常に等しくないと比較されます。
- その他の変更については、ビルドおよびCAPIの変更および Cコードの移植を参照してください。
(:issue: `10181` でStefanKrahによって寄稿されました。)
PEP 393:柔軟な文字列表現
Unicode文字列タイプは、表現された文字列内で最大のUnicode序数(1、2、または4バイト)を持つ文字に応じて、複数の内部表現をサポートするように変更されます。 これにより、一般的なケースでスペース効率の高い表現が可能になりますが、すべてのシステムで完全なUCS-4にアクセスできます。 既存のAPIとの互換性のために、複数の表現が並行して存在する場合があります。 時間の経過とともに、この互換性は段階的に廃止される必要があります。
Python側では、この変更にマイナス面はないはずです。
C API側では、 PEP 393 は完全な下位互換性があります。 レガシーAPIは少なくとも5年間利用可能である必要があります。 レガシーAPIを使用するアプリケーションは、メモリ削減のメリットを十分に享受できません。さらに悪いことに、Pythonは各文字列の2つのバージョンを(レガシー形式と新しい効率的なストレージで)維持する必要があるため、少し多くのメモリを使用する可能性があります。
機能性
PEP 393 によって導入された変更は次のとおりです。
- Pythonは、非BMPコードポイントを含むすべてのUnicodeコードポイントを常にサポートするようになりました(つまり、
U+0000
からU+10FFFF
へ)。 ナロービルドとワイドビルドの区別はなくなり、PythonはWindowsでもワイドビルドのように動作するようになりました。 - ナロービルドの廃止に伴い、ナロービルドに固有の問題も修正されました。たとえば、次のようになります。
- len()は、非BMP文字に対して常に1を返すようになったため、
len('\U0010FFFF') == 1
; - サロゲートペアは文字列リテラルで再結合されないため、
'\uDBFF\uDFFF' != '\U0010FFFF'
; - 非BMP文字のインデックス作成またはスライスは期待値を返すため、
'\U0010FFFF'[0]
は'\uDBFF'
ではなく'\U0010FFFF'
を返すようになりました。 - 標準ライブラリの他のすべての関数は、非BMPコードポイントを正しく処理するようになりました。
- len()は、非BMP文字に対して常に1を返すようになったため、
- sys.maxunicode の値は、常に
1114111
(16進数で0x10FFFF
)になりました。PyUnicode_GetMax()
関数は、下位互換性のために0xFFFF
または0x10FFFF
のいずれかを返します。これは、新しいUnicode APIでは使用しないでください(:issue: `13054`を参照)。 )。 ./configure
フラグ--with-wide-unicode
は削除されました。
パフォーマンスとリソース使用量
Unicode文字列の格納は、文字列の最上位のコードポイントに依存するようになりました。
- 純粋なASCIIおよびLatin1文字列(
U+0000-U+00FF
)は、コードポイントごとに1バイトを使用します。 - BMP文字列(
U+0000-U+FFFF
)は、コードポイントごとに2バイトを使用します。 - 非BMP文字列(
U+10000-U+10FFFF
)は、コードポイントごとに4バイトを使用します。
正味の効果は、ほとんどのアプリケーションで、文字列ストレージのメモリ使用量が大幅に減少することです-特に以前のワイドユニコードビルドと比較して-多くの場合、文字列は国際的なコンテキストでも純粋なASCIIになります(多くの文字列は人間以外の言語を格納するため) XMLフラグメント、HTTPヘッダー、JSONエンコードデータなどのデータ)。 また、同じ理由で、重要なアプリケーションのCPUキャッシュ効率が向上することも期待しています。 Djangoベンチマークでは、Python3.3のメモリ使用量はPython3.2の2〜3分の1であり、Python 2.7よりも少し優れています(詳細については、PEPを参照してください)。
PEP 397:Windows用のPythonランチャー
Python 3.3 Windowsインストーラーには、バージョンに依存しない方法でPythonアプリケーションを起動するために使用できるpy
ランチャーアプリケーションが含まれるようになりました。
このランチャーは、*.py
ファイルをダブルクリックすると暗黙的に呼び出されます。 システムにPythonバージョンが1つだけインストールされている場合は、そのバージョンがファイルの実行に使用されます。 複数のバージョンがインストールされている場合、デフォルトで最新バージョンが使用されますが、これは、PythonスクリプトにUnixスタイルの「シバンライン」を含めることでオーバーライドできます。
ランチャーは、コマンドラインからpy
アプリケーションとして明示的に使用することもできます。 py
の実行は、スクリプトの暗黙的な起動と同じバージョン選択ルールに従いますが、適切な引数を渡すことで、より具体的なバージョンを選択できます(Python2もインストールされているときにPython3を要求する-3
など。または-2.6
は、より新しいバージョンがインストールされている場合に、以前のPythonバージョンを具体的に要求します)。
ランチャーに加えて、Windowsインストーラーには、新しくインストールされたPythonをシステムPATHに追加するオプションが含まれるようになりました。 (:issue: `3561` でBrianCurtinによって寄稿されました。)
も参照してください
- PEP 397 -Windows用Pythonランチャー
- マークハモンドとマーティンvによって書かれたPEP。 Löwis; VinaySajipによる実装。
ランチャーのドキュメント: Windows用のPythonランチャー
インストーラーのPATHの変更: Python実行可能ファイルの検索
PEP 3151:OSとIOの例外階層を作り直す
オペレーティングシステムのエラーによって発生する例外の階層が簡素化され、よりきめ細かくなりました。
OSError 、 IOError 、 EnvironmentError 、 WindowsError 、mmap.error
、 socket.error または select.error 。 これらの例外タイプはすべて、 OSError の1つだけになりました。 他の名前は、互換性の理由からエイリアスとして保持されます。
また、特定のエラー状態を簡単にキャッチできるようになりました。 errno
属性(またはargs[0]
)で errno モジュールの特定の定数を検査する代わりに、適切な OSError サブクラスをキャッチできます。 使用可能なサブクラスは次のとおりです。
BlockingIOError
ChildProcessError
ConnectionError
FileExistsError
FileNotFoundError
InterruptedError
IsADirectoryError
NotADirectoryError
PermissionError
ProcessLookupError
TimeoutError
また、 ConnectionError 自体には、よりきめ細かいサブクラスがあります。
新しい例外のおかげで、 errno の一般的な使用を回避できるようになりました。 たとえば、Python3.2用に記述された次のコード:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
errno をインポートせずに、例外属性を手動で検査せずに書き込むことができるようになりました。
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
PEP 380:サブジェネレーターに委任するための構文
PEP380はyield from
式を追加し、ジェネレーターがその操作の一部を別のジェネレーターに委任できるようにします。 これにより、 yield を含むコードのセクションを因数分解して、別のジェネレーターに配置できます。 さらに、サブジェネレーターは値を返すことができ、その値は委任ジェネレーターで使用できるようになります。
yield from
式は、主にサブジェネレーターへの委任で使用するために設計されていますが、実際には任意のサブイテレーターへの委任を許可します。
単純なイテレータの場合、yield from iterable
は基本的にfor item in iterable: yield item
の短縮形です。
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
ただし、通常のループとは異なり、yield from
を使用すると、サブジェネレーターは送信およびスローされた値を呼び出し元のスコープから直接受信し、最終的な値を外部ジェネレーターに返すことができます。
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
この変更を推進する主な原則は、send
およびthrow
メソッドで使用するように設計されたジェネレーターでさえ、単一の大きな関数に分割できるのと同じくらい簡単に複数のサブジェネレーターに分割できるようにすることです。複数のサブ機能。
も参照してください
- PEP 380 -サブジェネレーターに委任するための構文
- グレッグユーイングによって書かれたPEP; Greg Ewingによる実装、Renaud Blanch、Ryan Kelly、NickCoghlanによる3.3への統合。 ZbigniewJędrzejewski-SzmekとNickCoghlanによるドキュメント
PEP 409:例外コンテキストの抑制
PEP 409では、連鎖例外コンテキストの表示を無効にできる新しい構文が導入されています。 これにより、例外タイプ間で変換するアプリケーションでよりクリーンなエラーメッセージが可能になります。
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
原因を抑制するためのfrom None
サフィックスがないと、デフォルトで元の例外が表示されます。
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
必要に応じて元の例外コンテキストが引き続き使用可能であるため(たとえば、介在するライブラリが貴重な基礎となる詳細を誤って抑制した場合)、デバッグ機能が失われることはありません。
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
PEP 414:明示的なUnicodeリテラル
Unicodeリテラルを多用するUnicode対応のPythonアプリケーション用のPython2からの移行を容易にするために、Python3.3は文字列リテラルの「u
」プレフィックスを再びサポートします。 このプレフィックスは、Python 3ではセマンティックな意味を持ちません。これは、Python 3への移行における純粋に機械的な変更の数を減らすためだけに提供され、開発者がより重要なセマンティックな変更(バイナリのより厳密なデフォルトの分離など)に集中しやすくします。およびテキストデータ)。
PEP 3155:クラスと関数の修飾名
関数とクラスオブジェクトには、モジュールのトップレベルからその定義への「パス」を表す新しい__qualname__
属性があります。 グローバル関数およびクラスの場合、これは__name__
と同じです。 他の関数やクラスについては、それらが実際に定義された場所、およびグローバルスコープからそれらにアクセスする方法についてのより良い情報を提供します。
(バインドされていない)メソッドの例:
>>> class C:
... def meth(self):
... pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
ネストされたクラスの例:
>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
入れ子関数の例:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
これらのオブジェクトの文字列表現も変更され、新しいより正確な情報が含まれるようになりました。
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
PEP 412:キー共有辞書
オブジェクトの属性の格納に使用されるディクショナリは、内部ストレージの一部(つまり、キーとそれぞれのハッシュを格納する部分)を相互に共有できるようになりました。 これにより、組み込み型以外のインスタンスを多数作成するプログラムのメモリ消費量が削減されます。
PEP 362:関数シグネチャオブジェクト
新しい関数 inspect.signature()を使用すると、Pythonの呼び出し可能オブジェクトを簡単かつ簡単にイントロスペクトできます。 幅広い呼び出し可能オブジェクトがサポートされています:Python関数、装飾されているかどうか、クラス、および functools.partial()オブジェクト。 新しいクラス inspect.Signature 、 inspect.Parameter 、 inspect.BoundArguments は、アノテーション、デフォルト値、パラメーターの種類、バインドされた引数。これにより、デコレータや、呼び出し署名または引数を検証または修正するコードの記述が大幅に簡素化されます。
も参照してください
- PEP 362 :-関数シグネチャオブジェクト
- Brett Cannon、Yury Selivanov、Larry Hastings、JiwonSeoによって書かれたPEP。 YurySelivanovによって実装されました。
PEP 421:sys.implementationの追加
sys モジュールの新しい属性は、現在実行中のインタープリターの実装に固有の詳細を公開します。 sys.implementation の属性の初期セットは、name
、version
、hexversion
、およびcache_tag
です。
sys.implementation
の目的は、標準ライブラリで使用される実装固有のデータを1つの名前空間に統合することです。 これにより、さまざまなPython実装が単一の標準ライブラリコードベースをはるかに簡単に共有できるようになります。 初期状態では、sys.implementation
は実装固有のデータのごく一部しか保持していません。 標準ライブラリの移植性を高めるために、時間の経過とともにその比率は変化します。
標準ライブラリの移植性が向上した一例は、cache_tag
です。 Python 3.3以降、sys.implementation.cache_tag
は importlib によって使用され、 PEP 3147 への準拠をサポートします。 組み込みのインポートシステムにimportlib
を使用するPython実装は、cache_tag
を使用してモジュールのキャッシュ動作を制御できます。
SimpleNamespace
sys.implementation
の実装では、Pythonに新しい型 types.SimpleNamespace も導入されています。 dict のようなマッピングベースの名前空間とは対照的に、SimpleNamespace
は object のような属性ベースです。 ただし、object
とは異なり、SimpleNamespace
インスタンスは書き込み可能です。 これは、通常の属性アクセスを介して名前空間を追加、削除、および変更できることを意味します。
インポートの実装としてimportlibを使用する
:issue: `2377` -__ import__をimportlib .__ import__に置き換えます:issue:` 13959` -純粋なPython で imp の一部を再実装します]:issue: `14605` -インポート機構を明示的にします:issue:` 14646` -ローダーに__loader__と__package__を設定する必要があります
__ import __()関数は、 importlib .__ import __()を利用するようになりました。 この作業により、 PEP 302 の「フェーズ2」が完了します。 この変更には複数の利点があります。 まず、Cコード内に暗黙的に隠されるのではなく、インポートを実行するより多くの機械を公開できるようになりました。 また、Python3.3をサポートするすべてのPythonVMが使用する単一の実装を提供し、インポートセマンティクスにおけるVM固有の逸脱を終わらせるのに役立ちます。 そして最後に、それは輸入の維持を容易にし、将来の成長が起こることを可能にします。
一般ユーザーの場合、セマンティクスに目に見える変化はないはずです。 コードが現在インポートを操作している、またはプログラムでインポートを呼び出している場合、必要になる可能性のあるコードの変更については、このドキュメントの Pythonコードの移植セクションで説明しています。
新しいAPI
この作業の大きな利点の1つは、インポートステートメントを機能させるために何が行われるかを明らかにすることです。 つまり、かつては暗黙的だったさまざまなインポーターが、 importlib パッケージの一部として完全に公開されるようになりました。
importlib.abc で定義されている抽象基本クラスは、 importlib.abcを導入することにより、メタパスファインダーとパスエントリファインダーを適切に区別するように拡張されました。 MetaPathFinder と importlib.abc.PathEntryFinder 。 importlib.abc.Finder の古いABCは、下位互換性のためにのみ提供され、メソッド要件を強制しません。
ファインダーに関しては、 importlib.machinery.FileFinder は、モジュールのソースファイルとバイトコードファイルの検索に使用されるメカニズムを公開します。 以前は、このクラスは sys.path_hooks の暗黙的なメンバーでした。
ローダーの場合、新しい抽象基本クラス importlib.abc.FileLoader は、モジュールのコードのストレージメカニズムとしてファイルシステムを使用するローダーの作成に役立ちます。 ソースファイル( importlib.machinery.SourceFileLoader )、ソースレスバイトコードファイル( importlib.machinery.SourcelessFileLoader )、および拡張モジュール( importlib.machinery.ExtensionFileLoader )のローダー])直接使用できるようになりました。
ImportError に、提供する関連データがある場合に設定されるname
およびpath
属性が追加されました。 インポートに失敗した場合のメッセージには、モジュール名の末尾だけでなく、モジュールのフルネームも表示されるようになりました。
importlib.invalidate_caches()関数は、 sys.path_importer_cache にキャッシュされているすべてのファインダーで同じ名前のメソッドを呼び出し、必要に応じて保存されている状態をクリーンアップできるようになりました。
目に見える変化
コードに必要となる可能性のある変更については、 Pythonコードの移植セクションを参照してください。
importlib が現在公開しているものの範囲を超えて、インポートする他の目に見える変更があります。 最大のものは、 sys.meta_path と sys.path_hooks が、インポートで使用されるすべてのメタパスファインダーとパスエントリフックを格納するようになったことです。 以前は、ファインダーは暗黙的であり、直接公開されるのではなく、インポートのCコード内に隠されていました。 これは、ニーズに合わせてさまざまなファインダーの順序を簡単に削除または変更できることを意味します。
もう1つの変更点は、すべてのモジュールに__loader__
属性があり、モジュールの作成に使用されたローダーが格納されていることです。 PEP 302 が更新され、ローダーの実装にこの属性が必須になりました。したがって、将来、サードパーティのローダーが更新されると、人々は属性。 ただし、そのようなときまで、インポートはモジュールのポストロードを設定しています。
ローダーは、 PEP 366 から__package__
属性を設定することも期待されています。 繰り返しになりますが、インポート自体はすでに importlib からのすべてのローダーでこれを設定しており、インポート自体は属性post-loadを設定しています。
sys.path_hooks にファインダーが見つからない場合、None
が sys.path_importer_cache に挿入されるようになりました。 imp.NullImporter は sys.path_hooks に直接公開されていないため、ファインダーが見つからないことを表す値として常に使用できるとは限りません。
他のすべての変更は、Python 3.3のコードを更新するときに考慮する必要があるセマンティックの変更に関連しているため、このドキュメントの Pythonコードの移植セクションで読む必要があります。
(ブレットキャノンによる実装)
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
Unicode名エイリアスと名前付きシーケンスのサポートが追加されました。 unicodedata.lookup()と
'\N{...}'
の両方が名前エイリアスを解決し、 unicodedata.lookup()も名前付きシーケンスを解決するようになりました。(:issue: `12753` のEzioMelottiによる寄稿。)
UnicodeデータベースがUCDバージョン6.1.0に更新されました
range()オブジェクトの等価比較は、これらの範囲オブジェクトによって生成された基になるシーケンスの等価を反映する結果を返すようになりました。 (:issue: `13201` )
count()
、find()
、rfind()
、index()
、rindex()
メソッドのバイト、バイトアレイ[ X104X]オブジェクトは、最初の引数として0から255までの整数を受け入れるようになりました。(:issue: `12170` でPetriLehtinenによって寄稿されました。)
bytes および bytearray の
rjust()
、ljust()
、およびcenter()
メソッドは、 bytearray を受け入れるようになりました。fill
引数。 (:issue: `12380` でPetriLehtinenによって寄稿されました。)list および bytearray に新しいメソッドが追加されました:
copy()
およびclear()
(:issue: `10516` )。 その結果、 MutableSequence は、clear()
メソッド(:issue: `11388` )も定義するようになりました。生のバイトリテラルは、
rb"..."
およびbr"..."
に書き込むことができるようになりました。(:issue: `13748` のAntoinePitrouによる寄稿。)
dict.setdefault()は、指定されたキーに対して1回のルックアップのみを実行するようになり、組み込み型で使用するとアトミックになります。
(:issue: `13521` のFilipGruszczyńskiによる寄稿。)
関数呼び出しが関数シグネチャと一致しない場合に生成されるエラーメッセージが大幅に改善されました。
(Benjamin Petersonによる寄稿。)
きめ細かいインポートロック
以前のバージョンのCPythonは、常にグローバルインポートロックに依存していました。 これにより、モジュールをインポートするときにデッドロックが発生し、副作用として別のスレッドでコードが実行されるなど、予期しない問題が発生しました。 PyImport_ImportModuleNoBlock() C API関数など、不器用な回避策が採用されることがありました。
Python 3.3では、モジュールをインポートするとモジュールごとのロックがかかります。 これにより、複数のスレッドからの特定のモジュールのインポートが正しくシリアル化され(不完全に初期化されたモジュールが公開されるのを防ぎます)、前述の煩わしさがなくなります。
(:issue: `9260` のAntoinePitrouによる寄稿。)
組み込み関数とタイプ
- open()は新しい opener パラメーターを取得します。ファイルオブジェクトの基になるファイル記述子は、( file で opener を呼び出すことによって取得されます。 、フラグ)。 たとえば、 os.O_CLOEXEC などのカスタムフラグを使用するために使用できます。
'x'
モードが追加されました:排他的作成のために開き、ファイルがすでに存在する場合は失敗します。 - print(): flush キーワード引数を追加しました。 flush キーワード引数がtrueの場合、ストリームは強制的にフラッシュされます。
- hash():ハッシュランダム化はデフォルトで有効になっています。 object .__ hash __()および PYTHONHASHSEED を参照してください。
- str タイプは、新しい casefold()メソッドを取得します。文字列の大文字と小文字を区別したコピーを返します。大文字と小文字を区別しない文字列は大文字と小文字を区別しないマッチングに使用できます。 たとえば、
'ß'.casefold()
は'ss'
を返します。 - シーケンスのドキュメントは、バイナリ/テキストシーケンスの違いをよりよく説明し、個々の組み込みシーケンスタイプに固有のドキュメントセクションを提供するために大幅に書き直されました(:issue: `4966` )。
新しいモジュール
フォールトハンドラー
この新しいデバッグモジュール faulthandler には、障害(セグメンテーション違反などのクラッシュ)、タイムアウト後、またはユーザーシグナルでPythonトレースバックを明示的にダンプする関数が含まれています。 faulthandler.enable()を呼び出して、SIGSEGV
、SIGFPE
、SIGABRT
、SIGBUS
、およびSIGILL
信号。 PYTHONFAULTHANDLER 環境変数を設定するか、 -X faulthandler
コマンドラインオプションを使用して、起動時にこれらを有効にすることもできます。
Linuxでのセグメンテーション違反の例:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
IPアドレス
新しい ipaddress モジュールは、IPv4およびIPv6アドレス、ネットワーク、およびインターフェイスを表すオブジェクトを作成および操作するためのツールを提供します(つまり、 特定のIPサブネットに関連付けられたIPアドレス)。
( PEP 3144 でGoogleとPeterMoodyによって寄稿されました。)
lzma
新しく追加された lzma モジュールは、.xz
および.lzma
ファイル形式のサポートを含め、LZMAアルゴリズムを使用してデータの圧縮と解凍を提供します。
(:issue: `6715` でNadeemVawdaとPerØyvindKarlsenによって寄稿されました。)
改善されたモジュール
abc
抽象メソッドで構成された記述子を含む抽象基本クラスのサポートが改善されました。 抽象記述子を宣言するための推奨されるアプローチは、動的に更新されるプロパティとして__isabstractmethod__
を提供することです。 組み込み記述子はそれに応じて更新されました。
- abc.abstractproperty は非推奨になりました。代わりに、 abc.abstractmethod()とともに property を使用してください。
- abc.abstractclassmethod は非推奨になりました。代わりに、 abc.abstractmethod()とともに classmethod を使用してください。
- abc.abstractstaticmethod は非推奨になりました。代わりに、 staticmethod と abc.abstractmethod()を使用してください。
(:issue: `11610` でDarrenDaleによって寄稿されました。)
abc.ABCMeta.register()は、登録されたサブクラスを返すようになりました。これは、クラスデコレータとして使用できることを意味します(:issue: `10868` )。
配列
array モジュールは、q
およびQ
タイプコードを使用する long long タイプをサポートします。
(:issue: `1172711` でOrenTiroshとHirokazuYamamotoによって寄稿されました。)
base64
ASCIIのみのUnicode文字列が、 base64 最新のインターフェイスのデコード機能で受け入れられるようになりました。 たとえば、base64.b64decode('YWJj')
はb'abc'
を返します。 (:issue: `13641` のCatalinIacobによる寄稿。)
binascii
通常受け入れるバイナリオブジェクトに加えて、a2b_
関数もすべてASCIIのみの文字列を入力として受け入れるようになりました。 (:issue: `13637` のAntoinePitrouによる寄稿。)
bz2
bz2 モジュールは最初から書き直されました。 その過程で、いくつかの新機能が追加されました。
新しい bz2.open()関数:バイナリモードまたはテキストモードでbzip2圧縮ファイルを開きます。
bz2.BZ2File は、コンストラクターの fileobj 引数を使用して、任意のファイルのようなオブジェクトの読み取りと書き込みができるようになりました。
(:issue: `5863` のNadeemVawdaによる寄稿。)
bz2.BZ2File および bz2.decompress()で、マルチストリーム入力( pbzip2 ツールで生成されたものなど)を解凍できるようになりました。 bz2.BZ2File は、
'a'
(追加)モードを使用して、このタイプのファイルを作成するためにも使用できるようになりました。(:issue: `1625` のNirAidesによる寄稿。)
bz2.BZ2File は、
detach()
メソッドとtruncate()
メソッドを除く、すべての io.BufferedIOBase APIを実装するようになりました。
コーデック
mbcs コーデックは、すべてのWindowsバージョンでreplace
およびignore
エラーハンドラーを正しく処理するように書き直されました。 mbcs コーデックは、エンコードするreplace
とデコードするignore
だけでなく、すべてのエラーハンドラーをサポートするようになりました。
新しいWindows専用コーデックが追加されました:cp65001
(:issue: `13216` )。 これは、Windowsコードページ65001(Windows UTF-8、CP_UTF8
)です。 たとえば、コンソール出力コードページがcp65001に設定されている場合(たとえば、chcp 65001
コマンドを使用)、sys.stdout
によって使用されます。
マルチバイトCJKデコーダーがより高速に再同期するようになりました。 無効なバイトシーケンスの最初のバイトのみを無視します。 たとえば、b'\xff\n'.decode('gb2312', 'replace')
は、置換文字の後に\n
を返すようになりました。
インクリメンタルCJKコーデックエンコーダーは、encode()メソッドを呼び出すたびにリセットされなくなりました。 例えば:
>>> import codecs
>>> encoder = codecs.getincrementalencoder('hz')('strict')
>>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
b'~{NpJ)l6HK!#~} Bye.'
この例では、古いPythonバージョンでb'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'
を示しています。
unicode_internal
コーデックは非推奨になりました。
コレクション
新しい ChainMap クラスが追加され、多数のマッピングを1つのユニットとして扱うことができるようになりました。 (Raymond Hettingerによって:issue: `11089` 用に作成され、:issue:` 11297` で公開されました。)
抽象基本クラスは新しい collections.abc モジュールに移動され、抽象コレクションクラスと具象コレクションクラスをより明確に区別できるようになりました。 ABCのエイリアスは、既存のインポートを保持するために collections モジュールに引き続き存在します。 (:issue: `11085` )
Counter クラスは、単項+
および-
演算子、およびインプレース演算子+=
、-=
、をサポートするようになりました。 |=
、および&=
。 (:issue: `13121` でRaymondHettingerによって寄稿されました。)
contextlib
ExitStack は、コンテキストマネージャーのプログラムによる操作および同様のクリーンアップ機能の強固な基盤を提供するようになりました。 以前のcontextlib.nested
API(非推奨で削除されました)とは異なり、新しいAPIは、コンテキストマネージャーが__init__
メソッド(ファイルオブジェクトなど)でリソースを取得するかどうかに関係なく、正しく機能するように設計されています。または、__enter__
メソッド(たとえば、 threading モジュールからの同期オブジェクト)。
のろい
- curses モジュールがncurseswライブラリにリンクされている場合、Unicode文字列または文字が渡されるときにUnicode関数を使用します(例:
waddwstr()
)、バイトはそれ以外の場合は機能します(例:waddstr()
)。- Unicode文字列をエンコードするには、
utf-8
の代わりにロケールエンコードを使用します。curses.window
には、新しい curses.window.encoding 属性があります。curses.window
クラスには、ワイド文字を取得するための新しい get_wch()メソッドがあります。- curses モジュールには、ワイド文字をプッシュする新しい unget_wch()関数があり、次の get_wch()がそれを返します。
(:issue: `6755` でIñigoSernaによって寄稿されました。)
日付時刻
- ナイーブインスタンスとアウェア datetime インスタンス間の等価比較では、 TypeError (:issue: `15006` )を発生させる代わりに、 False が返されるようになりました。
- 新しい datetime.datetime.timestamp()メソッド: datetime インスタンスに対応するPOSIXタイムスタンプを返します。
- datetime.datetime.strftime()メソッドは、1000年より古いフォーマットをサポートします。
- datetime.datetime.astimezone()メソッドを引数なしで呼び出して、datetimeインスタンスをシステムタイムゾーンに変換できるようになりました。
10進数
- :issue: `7652` -高速のネイティブ10進演算を統合します。
- StefanKrahによって作成されたCモジュールとlibmpdec。
10進モジュールの新しいCバージョンは、高速libmpdecライブラリを統合して、任意精度の正しく丸められた10進浮動小数点演算を実現します。 libmpdecは、IBMの一般的な10進算術仕様に準拠しています。
パフォーマンスの向上は、データベースアプリケーションの10倍から、数値を多用するアプリケーションの100倍までの範囲です。 これらの数値は、10進浮動小数点演算で使用される標準精度の期待されるゲインです。 精度はユーザーが構成できるため、正確な数値は異なる場合があります。 たとえば、整数のbignum演算では、差が大幅に大きくなる可能性があります。
次の表は、説明のためのものです。 ベンチマークは http://www.bytereef.org/mpdecimal/quickstart.html で入手できます。
decimal.py _decimal スピードアップ 円周率 42.02秒 0.345秒 120倍 telco 172.19秒 5.68秒 30倍 psycopg 3.57秒 0.29秒 12倍
特徴
- FloatOperation 信号は、オプションで、floatとDecimalsを混合するためのより厳密なセマンティクスを有効にします。
- Pythonがスレッドなしでコンパイルされている場合、Cバージョンは高価なスレッドローカルコンテキスト機構を自動的に無効にします。 この場合、変数 HAVE_THREADS は
False
に設定されます。
APIの変更
Cモジュールには、マシンアーキテクチャに応じて、次のコンテキスト制限があります。
32ビット
64ビット
MAX_PREC
425000000
999999999999999999
MAX_EMAX
425000000
999999999999999999
MIN_EMIN
-425000000
-999999999999999999
コンテキストテンプレート( DefaultContext 、 BasicContext 、 ExtendedContext )では、
Emax
とEmin
の大きさが999999
。decimal.pyの Decimal コンストラクターは、コンテキスト制限を監視せず、任意の指数または精度で値を正確に変換します。 Cバージョンには内部制限があるため、次のスキームが使用されます。可能であれば、値は正確に変換されます。それ以外の場合は、 InvalidOperation が発生し、結果はNaNになります。 後者の場合、丸められた値または不正確な値を取得するために、 create_decimal()を使用することが常に可能です。
decimal.pyのべき関数は常に正しく丸められます。 Cバージョンでは、正しく丸められた exp()関数と ln()関数で定義されていますが、最終的な結果は「ほぼ常に正しく丸められている」だけです。
Cバージョンでは、シグナルを含むコンテキストディクショナリは MutableMapping です。 速度上の理由から、
flags
とtraps
は、コンテキストが初期化されたときと同じ MutableMapping を常に参照します。 新しい信号ディクショナリが割り当てられると、flags
とtraps
は新しい値で更新されますが、RHSディクショナリは参照されません。Context を選択すると、PythonバージョンとCバージョンに共通の交換形式を使用するために、異なる出力が生成されます。
quantize()メソッドの
watchexp
パラメーターは非推奨になりました。
Eメール
ポリシーフレームワーク
電子メールパッケージにポリシーフレームワークが追加されました。 Policy は、電子メールパッケージの動作を制御するいくつかのメソッドとプロパティを持つオブジェクトです。 Python3.3の主要なポリシーは Compat32 ポリシーであり、Python3.2の電子メールパッケージとの下位互換性を提供します。 policy
は、電子メールメッセージがパーサーによって解析されるとき、メッセージオブジェクトが作成されるとき、または電子メールがを使用してシリアル化されるときに指定できます。 ]ジェネレーター。 オーバーライドされない限り、parser
に渡されたポリシーは、parser
によって作成されたすべてのMessage
オブジェクトおよびサブオブジェクトに継承されます。 デフォルトでは、generator
はシリアル化するMessage
オブジェクトのポリシーを使用します。 デフォルトのポリシーは compat32 です。
すべてのpolicy
オブジェクトによって実装されるコントロールの最小セットは次のとおりです。
max_line_length Message
がシリアル化されるときに、linesep文字を除く個々の行の最大長。 デフォルトは78です。linesep Message
がシリアル化されるときに個々の行を区切るために使用される文字。 デフォルトは\n
です。cte_type 7bit
または8bit
。8bit
は、Bytes
generator
にのみ適用され、プロトコルで許可されている場合(または元の入力に存在する場合)に非ASCIIを使用できることを意味します。raise_on_defect Message
オブジェクトのdefects
リストに欠陥を追加する代わりに、欠陥が発生したときにparser
でエラーが発生します。
ポリシーオブジェクトの clone()メソッドを使用して、新しい設定の新しいポリシーインスタンスが作成されます。 clone
は、上記のコントロールのいずれかをキーワード引数として使用します。 呼び出しで指定されていないコントロールは、デフォルト値を保持します。 したがって、次のように\r\n
ラインセプ文字を使用するポリシーを作成できます。
mypolicy = compat32.clone(linesep='\r\n')
ポリシーを使用すると、アプリケーションで必要な形式のメッセージを簡単に生成できます。 generator
と呼ぶすべての場所でlinesep='\r\n'
を指定することを忘れないでください。parser
または[ X169X] 、プログラムがMessage
オブジェクトの作成に使用する方。 一方、複数の形式でメッセージを生成する必要がある場合でも、適切なgenerator
呼び出しでパラメーターを指定できます。 または、さまざまなケースに合わせてカスタムポリシーインスタンスを作成し、generator
を作成するときにそれらを渡すことができます。
新しいヘッダーAPIを使用した暫定ポリシー
ポリシーフレームワークはそれ自体で価値がありますが、それを導入する主な動機は、新しいポリシーを使用しないユーザーの下位互換性を維持する方法で、電子メールパッケージの新しい機能を実装する新しいポリシーの作成を許可することです。 新しいポリシーは新しいAPIを導入するため、Python3.3で暫定ポリシーとしてリリースします。 コア開発者が必要と判断した場合、後方互換性のない変更(コードの削除を含む)が発生する可能性があります。
新しいポリシーは EmailPolicy のインスタンスであり、次の追加のコントロールを追加します。
header_factory
は、新しいポリシーによって提供される新機能の鍵です。 新しいポリシーの1つが使用される場合、Message
オブジェクトから取得されるヘッダーは、header_factory
によって生成されるオブジェクトであり、Message
にヘッダーを設定するたびにheader_factory
によって生成されるオブジェクトになります。 このようなヘッダーオブジェクトはすべて、ヘッダー名と同じname
属性を持っています。 AddressヘッダーとDateヘッダーには、ヘッダーの解析済みデータへのアクセスを可能にする追加の属性があります。 これは、次のようなことができることを意味します。
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <[email protected]>'
>>> m['to']
'Éric <[email protected]>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400
メッセージがシリアル化されると、Unicode表示名はutf-8
として自動的にエンコードされますが、ヘッダーに直接アクセスすると、Unicodeバージョンが取得されることに注意してください。 これにより、 email.header decode_header()または make_header()関数を処理する必要がなくなります。
パーツからアドレスを作成することもできます。
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='[email protected]')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <[email protected]>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <[email protected]>, Sally <[email protected]>;, Bonzo <[email protected]>
Unicodeへのデコードは自動的に行われます。
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <[email protected]>'
メッセージを解析するとき、ヘッダーオブジェクトのaddresses
およびgroups
属性を使用して、グループおよび個々のアドレスにアクセスできます。
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
要約すると、新しいポリシーの1つを使用する場合、ヘッダー操作は本来の方法で機能します。アプリケーションはUnicode文字列で機能し、電子メールパッケージはRFC標準のContent TransferEncodingsとの間でUnicodeを透過的にエンコードおよびデコードします。
その他のAPIの変更
新しい BytesHeaderParser が、 parser モジュールに追加され、 HeaderParser を補完し、BytesAPIを完成させました。
新しいユーティリティ関数:
- format_datetime(): datetime を指定して、電子メールヘッダーで使用するためにフォーマットされた文字列を生成します。
- parsedate_to_datetime():電子メールヘッダーから日付文字列を指定すると、それを認識可能な datetime に変換するか、オフセットが [の場合は単純な datetime に変換します。 X170X]。
- localtime():引数なしで、ローカルタイムゾーンを使用して、現在のローカル時間を認識 datetime として返します。 認識している datetime を指定すると、ローカルの timezone を使用して、認識している datetime に変換します。
ftplib
- ftplib.FTP は、
source_address
キーワード引数を受け入れて、発信ソケットの作成時にバインド呼び出しで送信元アドレスとして使用する(host, port)
を指定するようになりました。 (:issue: `8594` のGiampaoloRodolàによる寄稿。) - FTP_TLS クラスは、制御チャネルをプレーンテキストに戻すための新しい ccc()関数を提供するようになりました。 これは、固定ポートを開かずに非セキュアFTPでNATを処理する方法を知っているファイアウォールを利用するのに役立ちます。 (:issue: `12139` のGiampaoloRodolàによる寄稿。)
- 解析可能なディレクトリリスト形式を提供し、 ftplib.FTP.nlst()および ftplib.FTP.dir()を非推奨にする ftplib.FTP.mlsd()メソッドを追加しました]。 (:issue: `11072` のGiampaoloRodolàによる寄稿。)
functools
functools.lru_cache()デコレータは、typed
キーワード引数を受け入れるようになりました(デフォルトではFalse
になり、別々のキャッシュスロットで同等に比較されるさまざまなタイプの値が確実にキャッシュされます。 。 (:issue: `13227` でRaymondHettingerによって寄稿されました。)
hmac
新しい compare_digest()関数が追加され、タイミング分析を通じてダイジェストへのサイドチャネル攻撃を防止します。 (:issue: `15061` でNickCoghlanとChristianHeimesによって寄稿されました。)
http
http.server.BaseHTTPRequestHandler は、 end_headers()が呼び出されたときに、ヘッダーをバッファリングし、一度にすべて書き込むようになりました。 新しいメソッド flush_headers()を使用して、蓄積されたヘッダーが送信されるタイミングを直接管理できます。 (:issue: `3709` でAndrewSchaafによって寄稿されました。)
http.server は、有効なHTML 4.01 strict
出力を生成するようになりました。 (:issue: `13295` のEzioMelottiによる寄稿。)
http.client.HTTPResponse に readinto()メソッドが追加されました。これは、 io.RawIOBase クラスとして使用できることを意味します。 (:issue: `13464` でJohnKuhnによって寄稿されました。)
html
html.parser.HTMLParser は、エラーを発生させることなく壊れたマークアップを解析できるようになりました。そのため、コンストラクターの strict 引数とHTMLParseError
例外は非推奨になりました。 壊れたマークアップを解析する機能は、Python 2.7 /3.2の最新のバグ修正リリースでも利用できる多くのバグ修正の結果です。 (:issue: `15114` 、および:issue:` 14538` 、:issue: `13993` 、のEzio Melottiによる寄稿: issue: `13960` 、:issue:` 13358` 、:issue: `1745761` 、:issue:` 755670` 、[X214X ]:issue: `13357` 、:issue:` 12629` 、:issue: `1200313` 、:issue:` 670664` 、 :issue: `13273` 、:issue:` 12888` 、:issue: `7311` 。)
HTML5の名前付き文字参照を同等のUnicode文字にマップする新しい html5 辞書(例: html5['gt;'] == '>'
)が html.entities モジュールに追加されました。 辞書は HTMLParser でも使用されるようになりました。 (:issue: `11113` および:issue:` 15156` でEzioMelottiによって寄稿されました。)
imaplib
IMAP4_SSL コンストラクターは、SSLContextパラメーターを受け入れて、セキュリティで保護されたチャネルのパラメーターを制御するようになりました。
(:issue: `8808` でSijinJosephによって寄稿されました。)
検査する
新しい getclosurevars()関数が追加されました。 この関数は、関数本体から参照されるすべての名前の現在のバインディングとそれらの名前が解決された場所を報告し、ステートフルクロージャに依存するコードをテストするときに正しい内部状態を簡単に確認できるようにします。
(:issue: `13062` でMeadorIngeとNickCoghlanによって寄稿されました。)
新しい getgeneratorlocals()関数が追加されました。 この関数は、ジェネレーターのスタックフレーム内のローカル変数の現在のバインディングを報告し、ジェネレーターをテストするときに正しい内部状態を簡単に確認できるようにします。
(:issue: `15153` のMeadorIngeによる寄稿。)
io
open()関数には、新しいファイルを排他的に作成するために使用できる新しい'x'
モードがあり、ファイルが既に存在する場合は FileExistsError を発生させます。 これは、fopen()に対するC11'x 'モードに基づいています。
(:issue: `12760` でDavidTownshendによって寄稿されました。)
TextIOWrapper クラスのコンストラクターには、新しい write_through オプションの引数があります。 write_through がTrue
の場合、write()
への呼び出しはバッファリングされないことが保証されます。バイナリバッファ。
ロギング
basicConfig()関数は、ルートロガーに追加されるハンドラーの反復可能をとるオプションのhandlers
引数をサポートするようになりました。
クラスレベルの属性append_nul
が SysLogHandler に追加され、syslogレコードへのNUL
(\000
)バイトの追加を制御できるようになりました。一部のデーモンは必要ですが、他のデーモンはログに渡されます。
mmap
read()メソッドは、他のファイルのようなオブジェクトとの互換性が向上しました。引数が省略されているか、None
として指定されている場合、現在のファイル位置から末尾までのバイトが返されます。マッピング。 (:issue: `12021` でPetriLehtinenによって寄稿されました。)
マルチプロセッシング
新しい multiprocessing.connection.wait()関数を使用すると、タイムアウトを使用して複数のオブジェクト(接続、ソケット、パイプなど)をポーリングできます。 (:issue: `12328` でRichardOudkerkによって寄稿されました。)
multiprocessing.Connection
オブジェクトは、マルチプロセッシング接続を介して転送できるようになりました。 (:issue: `4892` でRichardOudkerkによって寄稿されました。)
multiprocessing.Process は、daemon
キーワード引数を受け入れて、親プロセスからdaemon
フラグを継承するデフォルトの動作をオーバーライドするようになりました(:issue: `6064` [ X182X])。
新しい属性 multiprocessing.Process.sentinel を使用すると、プログラムは、適切なOSプリミティブ(たとえば、posixシステムの select )を使用して、一度に複数の Process オブジェクトを待機できます。 )。
新しいメソッド multiprocessing.pool.Pool.starmap()および starmap_async()は、既存の multiprocessing.poolと同等の itertools.starmap()を提供します。 Pool.map()および map_async()関数。 (:issue: `12708` のHynekSchlawackによる寄稿。)
nntplib
nntplib.NNTP クラスは、 socket.error 例外を無条件に消費し、完了時にNNTP接続を閉じるためのコンテキスト管理プロトコルをサポートするようになりました。
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(:issue: `9795` のGiampaoloRodolàによる寄稿。)
os
os モジュールには新しい pipe2()関数があり、 O_CLOEXEC または O_NONBLOCK フラグがアトミックに設定されたパイプを作成できます。 これは、マルチスレッドプログラムでの競合状態を回避するのに特に役立ちます。
os モジュールには新しい sendfile()関数があり、あるファイル(またはソケット)記述子から別の記述子にデータをコピーするための効率的な「ゼロコピー」方法を提供します。 「ゼロコピー」という句は、2つの記述子間のデータのすべてのコピーがカーネルによって完全に行われ、ユーザースペースバッファへのデータのコピーが行われないという事実を指します。 sendfile()を使用すると、ディスク上のファイルからネットワークソケットにデータを効率的にコピーできます。 ファイルをダウンロードするため。
(:issue: `10882` でRossLagerwallとGiampaoloRodolàによって提出されたパッチ。)
シンボリックリンク攻撃や一時ファイルやディレクトリの問題などの競合状態を回避するには、ファイル名の代わりにファイル記述子を操作する方が信頼性が高く(また高速です)。 Python 3.3は、既存の関数を拡張し、ファイル記述子(:issue: `4761` 、:issue:` 10755` 、:issue: `14626`)で機能する新しい関数を導入します。 )。
os モジュールには、 walk()と同様の新しい fwalk()関数がありますが、アクセスしたディレクトリを参照するファイル記述子も生成されます。 これは、シンボリックリンクの競合を回避するのに特に役立ちます。
次の関数は、新しいオプションの dir_fd (ディレクトリ記述子に関連するパス)および/または follow_symlinks (シンボリックリンクをたどらない)を取得します:[X175X ] access()、 chflags()、 chmod()、 chown()、 link()、[X267X ] lstat()、 mkdir()、 mkfifo()、 mknod()、 open()、[X365X ] readlink()、 remove()、 rename()、 replace()、 rmdir()、[X472X ] stat()、シンボリックリンク()、 unlink()、 utime()。 これらのパラメーターを使用するためのプラットフォームのサポートは、セット os.supports_dir_fd および
os.supports_follows_symlinks
を介して確認できます。次の関数は、パス引数のファイル記述子をサポートするようになりました: chdir()、 chmod()、 chown()、 execve()[ X145X]、 listdir()、 pathconf()、 exists()、 stat()、 statvfs()[ X242X]、 utime()。 これに対するプラットフォームのサポートは、 os.supports_fd セットを介して確認できます。
access()は、
effective_ids
キーワード引数を受け入れて、アクセスチェックで実際のuid / gidではなく有効なuid / gidを使用してオンにします。 これに対するプラットフォームのサポートは、 supports_effective_ids セットを介して確認できます。os モジュールには、 getpriority()と setpriority()の2つの新しい関数があります。 これらは、 os.nice()と同様の方法でプロセスの適切性/優先度を取得または設定するために使用できますが、現在のプロセスだけでなくすべてのプロセスに拡張されます。
(:issue: `10784` でGiampaoloRodolàによって提出されたパッチ。)
新しい os.replace()関数を使用すると、宛先を上書きして、クロスプラットフォームでファイルの名前を変更できます。 os.rename()を使用すると、既存の宛先ファイルはPOSIXで上書きされますが、Windowsではエラーが発生します。 (:issue: `8828` のAntoinePitrouによる寄稿。)
関数のstatファミリー( stat()、 fstat()、および lstat())は、ナノ秒の精度でファイルのタイムスタンプを読み取ることをサポートするようになりました。 対称的に、 utime()は、ナノ秒の精度でファイルのタイムスタンプを書き込むことができるようになりました。 (:issue: `14127` のLarryHastingsによる寄稿。)
新しい os.get_terminal_size()関数は、ファイル記述子に接続されている端末のサイズを照会します。 shutil.get_terminal_size()も参照してください。 (:issue: `13609` のZbigniewJędrzejewski-Szmekによる寄稿。)
- Linux拡張属性をサポートする新関数(:issue: `12720` ): getxattr()、 listxattr()、 removexattr()[X138X ]、 setxattr()。
- スケジューラへの新しいインターフェイス。 これらの関数は、オペレーティングシステムによってプロセスにCPU時間を割り当てる方法を制御します。 新しい関数: sched_get_priority_max()、 sched_get_priority_min()、 sched_getaffinity()、 sched_getparam()、 sched_get X166X]、 sched_rr_get_interval()、 sched_setaffinity()、 sched_setparam()、 sched_setscheduler()、 sched_yield X312X]、
- ファイルシステムを制御するための新機能:
- posix_fadvise():特定のパターンでデータにアクセスする意図をアナウンスし、カーネルが最適化できるようにします。
- posix_fallocate():ファイルに十分なディスク容量が割り当てられていることを確認します。
- sync():すべてをディスクに強制的に書き込みます。
- 追加の新しいposix関数:
- lockf():開いているファイル記述子にPOSIXロックを適用、テスト、または削除します。
- pread():オフセットでファイル記述子から読み取られます。ファイルオフセットは変更されません。
- pwrite():ファイルオフセットを変更せずに、オフセットからファイル記述子に書き込みます。
- readv():ファイル記述子からいくつかの書き込み可能なバッファーに読み取ります。
- truncate(): path に対応するファイルを切り捨てて、サイズが最大 length バイトになるようにします。
- waitid():1つ以上の子プロセスの完了を待ちます。
- writev(): buffers の内容をファイル記述子に書き込みます。ここで、 buffers は任意のバッファーシーケンスです。
- getgrouplist()(:issue: `9344` ):指定されたユーザーが属するグループIDのリストを返します。
- times()および uname():戻り値のタイプがタプルから名前付き属性を持つタプルのようなオブジェクトに変更されました。
- 一部のプラットフォームでは、
os.SEEK_HOLE
やos.SEEK_DATA
など、 lseek()関数の追加の定数がサポートされるようになりました。 - 新しい定数 RTLD_LAZY 、 RTLD_NOW 、 RTLD_GLOBAL 、 RTLD_LOCAL 、 RTLD_NODELETE 、 RTLD_NOLOAD および RTLD_DEEPBIND は、それらをサポートするプラットフォームで使用できます。 これらは sys.setdlopenflags()関数で使用するためのものであり、 ctypes および
DLFCN
で定義されている同様の定数に優先します。 (:issue: `13226` でVictorStinnerによって寄稿されました。) - os.symlink()は、クロスプラットフォームのサポートを容易にするために、Windows以外のプラットフォームで
target_is_directory
キーワード引数を受け入れる(そして無視する)ようになりました。
pdb
タブ補完は、コマンド名だけでなく、それらの引数でも使用できるようになりました。 たとえば、break
コマンドの場合、関数名とファイル名が入力されます。
(:issue: `14210` でGeorgBrandlによって寄稿されました)
きゅうりのピクルス
pickle.Pickler オブジェクトに、オプションの dispatch_table 属性が追加され、ピッカーごとの削減関数を設定できるようになりました。
(:issue: `14166` でRichardOudkerkによって寄稿されました。)
スケジュール
- run()は、 blocking パラメーターを受け入れるようになりました。これをfalseに設定すると、メソッドは、(存在する場合)最も早く期限切れになる予定のイベントを実行し、すぐに戻ります。 これは、非ブロッキングアプリケーションでスケジューラーを使用する場合に役立ちます。 (:issue: `13449` のGiampaoloRodolàによる寄稿。)
- scheduler クラスは、マルチスレッド環境で安全に使用できるようになりました。 (:issue: `8684` でJosiahCarlsonとGiampaoloRodolàによって寄稿されました。)
- scheduler クラスコンストラクターの timefunc および delayfunct パラメーターはオプションになり、デフォルトは time.time()および time.sleepになります。 ()それぞれ。 (:issue: `13245` でChrisClarkによって寄稿されました。)
- enter()および enterabs() 引数パラメーターがオプションになりました。 (:issue: `13245` でChrisClarkによって寄稿されました。)
- enter()および enterabs()は、 kwargs パラメーターを受け入れるようになりました。 (:issue: `13245` でChrisClarkによって寄稿されました。)
選択する
Solarisおよび派生プラットフォームには、/dev/poll
を介した高性能非同期ソケット用の新しいクラス select.devpoll があります。 (:issue: `6397` でJesúsCeaAviónによって寄稿されました。)
shlex
pipes モジュールの以前に文書化されていなかったヘルパー関数quote
は、 shlex モジュールに移動され、文書化されました。 quote()は、シェルによって特別な意味が与えられる可能性のある文字列内のすべての文字を適切にエスケープします。
シャティル
- 新機能:
- disk_usage():合計、使用済み、および空きディスク容量の統計を提供します。 (:issue: `12442` のGiampaoloRodolàによる寄稿。)
- chown():数値IDだけでなく、ユーザー/グループ名も指定して、指定されたパスのユーザーやグループを変更できます。 (:issue: `12191` のSandroTosiによる寄稿。)
- shutil.get_terminal_size():インタプリタが接続されているターミナルウィンドウのサイズを返します。 (:issue: `13609` のZbigniewJędrzejewski-Szmekによる寄稿。)
- copy2()および copystat()は、それをサポートするプラットフォームでファイルのタイムスタンプをナノ秒の精度で保持するようになりました。 また、Linux上でファイルの「拡張属性」を保持します。 (:issue: `14127` および:issue:` 15238` のLarryHastingsによる寄稿。)
- いくつかの関数は、オプションの
symlinks
引数を取るようになりました。そのパラメーターがtrueの場合、シンボリックリンクは逆参照されず、代わりに操作がシンボリックリンク自体に作用します(または関連する場合はシンボリックリンクを作成します)。 (:issue: `12715` のHynekSchlawackによる寄稿。) - ファイルを別のファイルシステムにコピーする場合、 move()はposix
mv
コマンドと同じようにシンボリックリンクを処理するようになり、ターゲットファイルの内容をコピーするのではなくシンボリックリンクを再作成します。 (:issue: `9993` のJonathanNiehofによる寄稿。) move()は、結果としてdst
引数も返すようになりました。 - rmtree()は、 os.open()および os.unlink()[の新しい
dir_fd
パラメーターをサポートするプラットフォームでのシンボリックリンク攻撃に耐性があります。 X150X]。 (:issue: `4489` でMartinvonLöwisとHynekSchlawackによって寄稿されました。)
信号
- signal モジュールには新しい機能があります。
- pthread_sigmask():呼び出し元のスレッドのシグナルマスクをフェッチおよび/または変更します(:issue: `8407` のJean-PaulCalderoneによる寄稿)。
- pthread_kill():スレッドにシグナルを送信します。
- sigpending():保留中の関数を調べます。
- sigwait():シグナルを待ちます。
- sigwaitinfo():シグナルを待ち、シグナルに関する詳細情報を返します。
- sigtimedwait(): sigwaitinfo()と同様ですが、タイムアウトがあります。
- シグナルハンドラーは、シグナル番号をnulバイトではなく1バイトとしてウェイクアップファイル記述子に書き込みます。 したがって、複数のシグナルを待機して、どのシグナルが発生したかを知ることができます。
- signal.signal()および signal.siginterrupt()は、RuntimeErrorではなくOSErrorを発生させます。OSErrorにはerrno属性があります。
smtpd
smtpd モジュールは、 RFC 5321 (拡張SMTP)および RFC 1870 (サイズ拡張)をサポートするようになりました。 標準では、これらの拡張機能は、クライアントがEHLO
コマンドでセッションを開始した場合にのみ有効になります。
(AlbertoTrevinoによる最初のELHO
サポート。 JuhanaJauhiainenによるサイズ拡張。 MicheleOrrùとDanBoswellによって提供されたパッチに関する実質的な追加作業。 :issue: `8739` )
smtplib
SMTP 、 SMTP_SSL 、および LMTP クラスは、source_address
キーワード引数を受け入れて、(host, port)
として使用するように指定するようになりました。発信ソケットを作成するときのバインド呼び出しの送信元アドレス。 (:issue: `11281` のPauloScardineによる寄稿。)
SMTP がコンテキスト管理プロトコルをサポートするようになり、SMTP
インスタンスをwith
ステートメントで使用できるようになりました。 (:issue: `11289` のGiampaoloRodolàによる寄稿。)
SMTP_SSL コンストラクターと starttls()メソッドは、SSLContextパラメーターを受け入れて、セキュリティで保護されたチャネルのパラメーターを制御するようになりました。 (:issue: `8809` のKasunHerathによる寄稿。)
ソケット
socket クラスは、基盤となるプラットフォームでサポートされている場合に、補助データを処理するための追加のメソッドを公開するようになりました。
(:issue: `6560` のDavidWatsonによる寄稿、Heiko Wundramによる以前のパッチに基づく)
socket クラスは、Linux( https://lwn.net)でPF_CANプロトコルファミリー( https://en.wikipedia.org/wiki/Socketcan )をサポートするようになりました。 / Articles / 253425 )。
(Matthias Fuchsによる寄稿、:issue: `10141` のTiagoGonçalvesによる更新。)
socket クラスは、PF_RDSプロトコルファミリ( https://en.wikipedia.org/wiki/Reliable_Datagram_Socketsおよび https://oss.oracle.com/projects)をサポートするようになりました。 / rds / )。
socket クラスは、OSXで
PF_SYSTEM
プロトコルファミリをサポートするようになりました。 (:issue: `13777` でMichaelGoderbauerによって寄稿されました。)新しい関数 sethostname()を使用すると、呼び出しプロセスに十分な特権がある場合に、UNIXシステムでホスト名を設定できます。 (:issue: `10866` でRossLagerwallによって寄稿されました。)
ソケットサーバー
BaseServer に、サービスループの serve_forever()メソッドによって呼び出されるオーバーライド可能なメソッド service_actions()が追加されました。 ForkingMixIn は、これを使用してゾンビの子プロセスをクリーンアップするようになりました。 (:issue: `11109` でJustinWarkentinによって寄稿されました。)
sqlite3
新しい sqlite3.Connection メソッド set_trace_callback()を使用して、sqliteによって処理されたすべてのsqlコマンドのトレースをキャプチャできます。 (:issue: `11688` のTorstenLandschoffによる寄稿。)
ssl
ssl モジュールには、2つの新しいランダム生成関数があります。
RAND_bytes():暗号的に強力な疑似ランダムバイトを生成します。
RAND_pseudo_bytes():疑似ランダムバイトを生成します。
(:issue: `12049` でVictorStinnerによって寄稿されました。)
ssl モジュールは、さまざまな種類のエラーの検査を容易にするために、よりきめ細かい例外階層を公開するようになりました。 (:issue: `11183` のAntoinePitrouによる寄稿。)
load_cert_chain()は、秘密鍵が暗号化されている場合に使用される password 引数を受け入れるようになりました。 (:issue: `12803` でAdamSimpkinsによって寄稿されました。)
通常のキー交換と楕円曲線ベースの両方のDiffie-Hellman鍵交換が、 load_dh_params()および set_ecdh_curve()メソッドでサポートされるようになりました。 (:issue: `13626` および:issue:` 13627` のAntoinePitrouによる寄稿。)
SSLソケットには、SCRAM-SHA-1-PLUSなどの特定の認証メカニズムの実装を可能にする新しい get_channel_binding()メソッドがあります。 (:issue: `12551` でJacekKoniecznyによって寄稿されました。)
新しい compression()メソッドのおかげで、SSLソケットで使用されるSSL圧縮アルゴリズムを照会できます。 新しい属性 OP_NO_COMPRESSION を使用して、圧縮を無効にすることができます。 (:issue: `13634` のAntoinePitrouによる寄稿。)
ssl.SSLContext.set_npn_protocols()メソッドを使用したNext ProtocolNegotiation拡張機能のサポートが追加されました。 (:issue: `14204` でColinMarcによって寄稿されました。)
ライブラリおよび reason 属性のおかげで、SSLエラーをより簡単にイントロスペクトできるようになりました。 (:issue: `14837` のAntoinePitrouによる寄稿。)
get_server_certificate()関数がIPv6をサポートするようになりました。 (:issue: `11811` でCharles-FrançoisNataliによって寄稿されました。)
新しい属性 OP_CIPHER_SERVER_PREFERENCE を使用すると、SSLv3サーバーソケットを設定して、クライアントではなくサーバーの暗号順序設定を使用できます(:issue: `13635` )。
統計
文書化されていないtarfile.filemode関数は stat.filemode()に移動されました。 ファイルのモードを「-rwxrwxrwx」の形式の文字列に変換するために使用できます。
(:issue: `14807` のGiampaoloRodolàによる寄稿。)
構造体
struct モジュールは、新しいコードn
およびN
を介して、それぞれssize_t
およびsize_t
をサポートするようになりました。 (:issue: `3163` のAntoinePitrouによる寄稿。)
サブプロセス
コマンド文字列は、posixプラットフォームでバイトオブジェクトにできるようになりました。 (:issue: `8513` でVictorStinnerによって寄稿されました。)
新しい定数 DEVNULL を使用すると、プラットフォームに依存しない方法で出力を抑制することができます。 (:issue: `5870` でRossLagerwallによって寄稿されました。)
tarfile
tarfile は、 lzma モジュールを介したlzma
エンコーディングをサポートするようになりました。 (:issue: `5689` でLarsGustäbelによって寄稿されました。)
tempfile
tempfile.SpooledTemporaryFile ' s truncate()
メソッドがsize
パラメーターを受け入れるようになりました。 (:issue: `9957` でRyanKellyによって寄稿されました。)
テキストの折り返し
textwrap モジュールには新しい indent()があり、テキストブロック内の選択した行に共通のプレフィックスを簡単に追加できます(:issue: `13857` [X167X ])。
糸脱毛
threading.Condition 、 threading.Semaphore 、 threading.BoundedSemaphore 、 threading.Event 、および threading.Timer 、以前はすべてクラスインスタンスを返すファクトリ関数でしたが、現在はクラスであり、サブクラス化できます。 (:issue: `10968` でÉricAraujoによって寄稿されました。)
threading.Thread コンストラクターは、daemon
キーワード引数を受け入れて、親スレッドからdaemon
フラグ値を継承するデフォルトの動作をオーバーライドするようになりました(:issue: ` 6064` )。
以前はプライベート関数_thread.get_ident
が、パブリック関数 threading.get_ident()として使用できるようになりました。 これにより、stdlibの_thread
モジュールに直接アクセスするいくつかのケースが排除されます。 _thread.get_ident
を使用したサードパーティのコードも同様に、新しいパブリックインターフェイスを使用するように変更する必要があります。
時間
PEP 418 は、 time モジュールに新しい機能を追加しました。
- get_clock_info():時計に関する情報を取得します。
- monotonic():単調クロック(逆方向に移動できません)。システムクロックの更新の影響を受けません。
- perf_counter():短時間を測定するために利用可能な最高の解像度を持つパフォーマンスカウンター。
- process_time():現在のプロセスのシステムとユーザーのCPU時間の合計。
その他の新機能:
- clock_getres()、 clock_gettime()、および clock_settime()関数は、
CLOCK_xxx
定数を使用します。 (:issue: `10278` でVictorStinnerによって寄稿されました。)
クロスプラットフォームの一貫性を向上させるために、 sleep()は、負のスリープ値が渡されたときに ValueError を発生させるようになりました。 以前は、これはposixでのエラーでしたが、Windowsでは無限のスリープが発生しました。
種類
新しい types.MappingProxyType クラスを追加します:マッピングの読み取り専用プロキシ。 (:issue: `14386` )
新しい関数 types.new_class()および types.prepare_class()は、 PEP 3115 準拠の動的型作成のサポートを提供します。 (:issue: `14588` )
単体テスト
assertRaises()、 assertRaisesRegex()、 assertWarns()、および assertWarnsRegex()は、キーワード引数 msg [を受け入れるようになりました。 X148X]コンテキストマネージャーとして使用する場合。 (:issue: `10775` でEzioMelottiとWinstonEwertによって寄稿されました。)
unittest.TestCase.run()は、 TestResult オブジェクトを返すようになりました。
urllib
Request クラスは、 get_method()が使用する method 引数を受け入れて使用するHTTPメソッドを決定するようになりました。 たとえば、これは'HEAD'
リクエストを送信します。
>>> urlopen(Request('https://www.python.org', method='HEAD'))
ウェブブラウザ
webbrowser モジュールは、より多くの「ブラウザ」をサポートします:Google Chrome( chrome 、 chromium 、 chrome-browser 、または chromium-という名前ブラウザ、バージョンとオペレーティングシステムによって異なります)、FreeDesktop.orgプロジェクトの汎用ランチャー xdg-open 、およびデフォルトのURIである gvfs-open GNOME3のハンドラー。 (前者は:issue: `13620` のArnaudCalmettesによって寄稿され、後者は:issue:` 14493` のMatthiasKloseによって寄稿されました。)
xml.etree.ElementTree
xml.etree.ElementTree モジュールは、デフォルトでCアクセラレーターをインポートするようになりました。 xml.etree.cElementTree
を明示的にインポートする必要はなくなりました(このモジュールは下位互換性のために残っていますが、現在は非推奨です)。 さらに、 Element のメソッドのiter
ファミリーが最適化されました(Cで書き直されました)。 モジュールのドキュメントも大幅に改善され、例とより詳細なリファレンスが追加されました。
zlib
新しい属性 zlib.Decompress.eof を使用すると、適切に形成された圧縮ストリームと、不完全または切り捨てられたストリームを区別できます。 (:issue: `12646` のNadeemVawdaによる寄稿。)
新しい属性 zlib.ZLIB_RUNTIME_VERSION は、実行時にロードされる基になるzlib
ライブラリのバージョン文字列を報告します。 (:issue: `12306` のTorstenLandschoffによる寄稿。)
最適化
主要なパフォーマンスの強化が追加されました。
PEP 393 のおかげで、Unicode文字列に対するいくつかの操作が最適化されました。
メモリフットプリントは、テキストに応じて2〜4で除算されます
ASCII文字列をUTF-8にエンコードする文字をエンコードする必要がなくなりました。UTF-8表現はASCII表現と共有されます。
UTF-8エンコーダーが最適化されました
単一のASCII文字を繰り返し、ASCII文字列のサブ文字列を取得する方が4倍高速です
UTF-8は2倍から4倍高速になりました。 UTF-16エンコーディングが最大10倍高速になりました。
(Serhiy Storchakaによる寄稿、:issue: `14624` 、:issue:` 14738` 、:issue: `15026` )
ビルドとCAPIの変更
PythonのビルドプロセスとCAPIへの変更は次のとおりです。
- 新しい PEP 3118 関連機能:
- PEP 393 は、新しいUnicodeタイプ、マクロ、および関数を追加しました。
- 高レベルAPI:
- 低レベルAPI:
- Py_UCS1 、 Py_UCS2 、 Py_UCS4 タイプ
- PyASCIIObject および PyCompactUnicodeObject 構造
PyUnicode_READY
PyUnicode_FromKindAndData()
- PyUnicode_AsUCS4()、 PyUnicode_AsUCS4Copy()
- PyUnicode_DATA 、 PyUnicode_1BYTE_DATA 、 PyUnicode_2BYTE_DATA 、 PyUnicode_4BYTE_DATA
- PyUnicode_KIND と
PyUnicode_Kind
列挙型: PyUnicode_WCHAR_KIND 、 PyUnicode_1BYTE_KIND 、 PyUnicode_2BYTE_KIND 、[X - PyUnicode_READ 、 PyUnicode_READ_CHAR 、 PyUnicode_WRITE
PyUnicode_MAX_CHAR_VALUE
- PyArg_ParseTuple は、
c
形式(:issue: `12380` )の bytearray を受け入れるようになりました。
非推奨
サポートされていないオペレーティングシステム
メンテナが不足しているため、OS / 2とVMSはサポートされなくなりました。
COMSPEC
をcommand.com
に設定したWindows2000およびWindowsプラットフォームは、メンテナンスの負担のためにサポートされなくなりました。
3.2で廃止されたOSFサポートは完全に削除されました。
非推奨のPythonモジュール、関数、メソッド
- 空でない文字列を
object.__format__()
に渡すことは非推奨であり、Python 3.4(:issue: `9856` )で TypeError が生成されます。 unicode_internal
コーデックは、 PEP 393 のために非推奨になりました。UTF-8、UTF-16(utf-16-le
またはutf-16-be
を使用してください])、またはUTF-32(utf-32-le
またはutf-32-be
)- ftplib.FTP.nlst()および ftplib.FTP.dir(): ftplib.FTP.mlsd()を使用
platform.popen()
:サブプロセスモジュールを使用します。 特に古い関数をサブプロセスモジュールセクションに置き換える(:issue: `11377` )を確認してください。- :issue: `13374` :WindowsバイトAPIは os モジュールで非推奨になりました。 バイトファイル名の代わりにUnicodeファイル名を使用して、ANSIコードページに依存しないようにし、任意のファイル名をサポートします。
- :issue: `13988` :
xml.etree.cElementTree
モジュールは非推奨です。 アクセラレータは、利用可能な場合は常に自動的に使用されます。 time.clock()
の動作は、プラットフォームによって異なります。要件に応じて、代わりに新しい time.perf_counter()または time.process_time()関数を使用してください。明確に定義された動作。os.stat_float_times()
関数は非推奨になりました。- abc モジュール:
- abc.abstractproperty は非推奨になりました。代わりに、 abc.abstractmethod()とともに property を使用してください。
- abc.abstractclassmethod は非推奨になりました。代わりに、 abc.abstractmethod()とともに classmethod を使用してください。
- abc.abstractstaticmethod は非推奨になりました。代わりに、 staticmethod と abc.abstractmethod()を使用してください。
- importlib パッケージ:
- importlib.abc.SourceLoader.path_mtime()は非推奨になり、 importlib.abc.SourceLoader.path_stats()が廃止されました。これは、バイトコードファイルにソースの変更時間とサイズの両方が保存されるようになったためです。バイトコードファイルがコンパイルされたファイル。
非推奨の関数とCAPIのタイプ
Py_UNICODE は PEP 393 で非推奨になり、Python4で削除される予定です。 このタイプを使用するすべての関数は非推奨です。
Py_UNICODE および Py_UNICODE * タイプを使用するUnicode関数およびメソッド:
- PyUnicode_FromUnicode : PyUnicode_FromWideChar()または PyUnicode_FromKindAndData()を使用します
- PyUnicode_AS_UNICODE 、 PyUnicode_AsUnicode()、 PyUnicode_AsUnicodeAndSize(): PyUnicode_AsWideCharString()を使用
- PyUnicode_AS_DATA : PyUnicode_DATA を PyUnicode_READ および PyUnicode_WRITE とともに使用します
- PyUnicode_GET_SIZE 、 PyUnicode_GetSize(): PyUnicode_GET_LENGTH または PyUnicode_GetLength()を使用します
- PyUnicode_GET_DATA_SIZE :
PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
を使用します(準備ができた文字列でのみ機能します) - PyUnicode_AsUnicodeCopy(): PyUnicode_AsUCS4Copy()または PyUnicode_AsWideCharString()を使用します
PyUnicode_GetMax()
Py_UNICODE *文字列を操作する関数とマクロ:
Py_UNICODE_strlen
: PyUnicode_GetLength()または PyUnicode_GET_LENGTH を使用しますPy_UNICODE_strcat
: PyUnicode_CopyCharacters()または PyUnicode_FromFormat()を使用しますPy_UNICODE_strcpy
、Py_UNICODE_strncpy
、Py_UNICODE_COPY
: PyUnicode_CopyCharacters()または PyUnicode_Substring()を使用しますPy_UNICODE_strcmp
: PyUnicode_Compare()を使用しますPy_UNICODE_strncmp
: PyUnicode_Tailmatch()を使用しますPy_UNICODE_strchr
、Py_UNICODE_strrchr
: PyUnicode_FindChar()を使用しますPy_UNICODE_FILL
: PyUnicode_Fill()を使用しますPy_UNICODE_MATCH
エンコーダー:
- PyUnicode_Encode():
PyUnicode_AsEncodedObject()
を使用 PyUnicode_EncodeUTF7()
- PyUnicode_EncodeUTF8(): PyUnicode_AsUTF8()または PyUnicode_AsUTF8String()を使用します
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUTF16()
- PyUnicode_EncodeUnicodeEscape()使用 PyUnicode_AsUnicodeEscapeString()
- PyUnicode_EncodeRawUnicodeEscape()使用 PyUnicode_AsRawUnicodeEscapeString()
- PyUnicode_EncodeLatin1(): PyUnicode_AsLatin1String()を使用します
- PyUnicode_EncodeASCII(): PyUnicode_AsASCIIString()を使用します
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
- PyUnicode_EncodeMBCS(): PyUnicode_AsMBCSString()または PyUnicode_EncodeCodePage()を使用します(
CP_ACP
code_pageを使用) PyUnicode_EncodeDecimal()
、 PyUnicode_TransformDecimalToASCII()
Python3.3への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
Pythonコードの移植
- ハッシュのランダム化はデフォルトで有効になっています。 PYTHONHASHSEED 環境変数を
0
に設定して、ハッシュのランダム化を無効にします。 object .__ hash __()メソッドも参照してください。 - :issue: `12326` :Linuxでは、sys.platformにメジャーバージョンが含まれなくなりました。 Pythonのビルドに使用されたLinuxのバージョンに応じて、「linux2」や「linux3」ではなく、常に「linux」になりました。 sys.platform == 'linux2'をsys.platform.startswith( 'linux')に置き換えるか、古いPythonバージョンをサポートする必要がない場合は直接sys.platform == 'linux'に置き換えます。
- :issue: `13847` 、:issue:` 14180` : time および datetime : OverflowError はタイムスタンプが範囲外の場合、 ValueError の代わりに発生するようになりました。 OSError は、C関数
gmtime()
またはlocaltime()
が失敗した場合に発生するようになりました。 - importで使用されるデフォルトのファインダーは、特定のディレクトリに含まれているもののキャッシュを利用するようになりました。 Pythonソースファイルまたはソースレスバイトコードファイルを作成する場合は、必ず importlib.invalidate_caches()を呼び出して、ファインダーが新しいファイルに気付くようにキャッシュをクリアしてください。
- ImportError は、インポートしようとしたモジュールのフルネームを使用するようになりました。 ImportErrorsのメッセージをチェックするDoctestは、名前の末尾だけでなく、モジュールのフルネームを使用するように更新する必要があります。
- __ import __()の index 引数は、デフォルトで-1ではなく0になり、負の値をサポートしなくなりました。 PEP 328 が実装されたとき、デフォルト値が-1のままだったのは見落としでした。 相対インポートに続いて絶対インポートを実行し続ける必要がある場合は、インデックス1を使用して相対インポートを実行し、続いてインデックス0を使用して別のインポートを実行します。 ただし、 __ import __()を直接呼び出すのではなく、 importlib.import_module()を使用することをお勧めします。
- __ import __()では、トップレベルモジュールに0以外のインデックス値を使用できなくなりました。 例えば
__import__('sys', level=1)
はエラーになりました。 - sys.meta_path と sys.path_hooks にはデフォルトでファインダーが含まれているため、
list.append()
の代わりにlist.insert()
を使用することをお勧めします。それらのリストに追加します。 None
が sys.path_importer_cache に挿入されるようになったため、ファインダーのないパスのディクショナリ内のエントリをクリアする場合は、[の値とペアになっているキーを削除する必要があります。 X210X] および imp.NullImporter は下位互換性があります。 これにより、None
を sys.path_importer_cache に再挿入する古いバージョンのPythonで余分なオーバーヘッドが発生します。ここで、暗黙のファインダーの使用を表しますが、意味的には何も変更されません。- importlib.abc.Finder は、実装する必要のある find_module()抽象メソッドを指定しなくなりました。 そのメソッドを実装するためにサブクラスに依存していた場合は、最初にメソッドの存在を確認してください。 ただし、パスエントリファインダーを使用する場合は、最初に find_loader()を確認することをお勧めします。
- pkgutil は、内部で importlib を使用するように変換されました。 これにより、 PEP 302 インポートエミュレーションの古い動作が実際のインポートシステムの動作と一致しなかった多くのエッジケースが排除されます。 インポートエミュレーション自体はまだ存在しますが、現在は非推奨です。 pkgutil.iter_importers()および pkgutil.walk_packages()関数は、標準のインポートフックの特殊なケースであるため、非標準の [を提供していなくても引き続きサポートされます。 X205X]メソッド。
- email.header.decode_header()によって行われる解析における長年のRFC準拠のバグ(:issue: `1079` )が修正されました。 標準のイディオムを使用してエンコードされたヘッダーをUnicode(
str(make_header(decode_header(h))
)に変換するコードは変更されませんが、decode_headerによって返される個々のタプルを調べるコードでは、ASCII
の前後の空白がわかります。セクションがASCII
セクションに含まれるようになりました。make_header
を使用してヘッダーを作成するコードも、変更なしで引き続き機能するはずです。make_header
は、ASCII
セクションとASCII
以外のセクションの間に空白を追加し続けるためです。入力文字列にはまだ存在していません。 - email.utils.formataddr()は、
ASCII
以外の表示名が渡されたときに、正しいコンテンツ転送エンコーディングを実行するようになりました。 フォーマットされた出力文字列に非ASCII
ユニコードを保持する以前のバグのある動作に依存するコードはすべて変更する必要があります(:issue: `1690608` )。 - poplib.POP3.quit()は、他のすべての
poplib
メソッドと同様にプロトコルエラーを発生させる可能性があります。quit
が poplib.error_proto エラーを発生させないと想定するコードは、特定のアプリケーションでquit
のエラーが発生した場合、変更する必要がある場合があります(:issue: ` 11291` )。 - email.parser.Parser の
strict
引数は、Python2.4以降非推奨になりましたがついに削除されました。 - 非推奨のメソッド
unittest.TestCase.assertSameElements
は削除されました。 - 非推奨の変数
time.accept2dyear
は削除されました。 - 非推奨の
Context._clamp
属性は、 10進数モジュールから削除されました。 以前は、パブリック属性clamp
に置き換えられていました。 (:issue: `8540` を参照してください。) - 文書化されていない内部ヘルパークラス
SSLFakeFile
は、その機能が socket.socket.makefile()によって直接提供されてきたため、 smtplib から削除されました。 - Windowsで time.sleep()に負の値を渡すと、永久にスリープするのではなく、エラーが発生するようになりました。 posixで常にエラーが発生していました。
ast.__version__
定数は削除されました。 ASTバージョンの影響を受ける決定を行う必要がある場合は、 sys.version_info を使用して決定を行ってください。- threading モジュールがプライベートクラスをサブクラス化することによってファクトリ関数を使用していたという事実を回避するために使用されたコードは、現在パブリッククラスをサブクラス化するように変更する必要があります。
- スレッドモジュール内の文書化されていないデバッグ機構が削除され、コードが簡素化されました。 これは本番コードには影響しないはずですが、アプリケーションデバッグフレームワークがそれと相互作用していた場合に備えて、ここで説明します(:issue: `13550` )。
Cコードの移植
バッファAPIの変更の過程で、 Py_buffer 構造の文書化されていない
smalltable
メンバーが削除され、PyMemoryViewObject
のレイアウトが変更されました。memoryobject.h
またはobject.h
の関連パーツに依存するすべての拡張機能を再構築する必要があります。PEP 393 により、 Py_UNICODE タイプおよびこのタイプを使用するすべての関数は非推奨になりました(ただし、少なくとも5年間は使用可能です)。 低レベルのUnicodeAPIを使用してUnicodeオブジェクトを構築およびアクセスしていて、 PEP 393 によって提供されるメモリフットプリントの削減を活用したい場合は、コードをに変換する必要があります。新しい Unicode API 。
ただし、 PyUnicode_Concat()、 PyUnicode_Join()、 PyUnicode_FromFormat()などの高レベルの関数のみを使用している場合、コードは自動的に利用されます新しいUnicode表現の。
PyImport_GetMagicNumber()は、失敗時に
-1
を返すようになりました。__ import __()の level 引数の負の値は無効になったため、 PyImport_ImportModuleLevel()にも同じことが当てはまります。 これは、 PyImport_ImportModuleEx()によって使用される level の値が、
-1
ではなく0
になったことも意味します。
C拡張機能の構築
C拡張子の可能なファイル名の範囲が狭められました。 ごくまれにしか使用されないスペルが抑制されました。POSIXでは、
xxxmodule.so
、xxxmodule.abi3.so
、およびxxxmodule.cpython-*.so
という名前のファイルはxxx
モジュールの実装として認識されなくなりました。 このようなファイルを生成していた場合は、他のスペルに切り替える必要があります(つまり、ファイル名からmodule
文字列を削除します)。(:issue: `14040` で実装されています。)
コマンドラインスイッチの変更
-Qコマンドラインフラグと関連するアーティファクトが削除されました。 sys.flags.division_warningをチェックするコードを更新する必要があります。
(:issue: `10998` 、ÉricAraujoによる寄稿。)
python が -S で開始された場合、
import site
はモジュール検索パスにサイト固有のパスを追加しなくなりました。 以前のバージョンでは、そうでした。(:issue: `11591` 、Carl Meyerが寄稿し、ÉricAraujoが版を作成しました。)