Python2.7の新機能
- 著者
- 午前 Kuchling(amk.caのamk)
この記事では、Python2.7の新機能について説明します。 Python2.7は2010年7月3日にリリースされました。
数値処理は、浮動小数点数と Decimal クラスの両方で、多くの点で改善されています。 大幅に拡張された unittest モジュール、コマンドラインオプションを解析するための argparse モジュール、便利な OrderedDict 、など、標準ライブラリにいくつかの便利な追加機能があります。 collections モジュールのX209X] Counter クラス、およびその他の多くの改善。
Python 2.7は2.xリリースの最後になる予定なので、長期的には良いリリースにすることに取り組みました。 Python 3への移植を支援するために、Python3.xシリーズのいくつかの新機能が2.7に含まれています。
この記事では、新機能の完全な仕様を提供するのではなく、便利な概要を提供します。 詳細については、 https://docs.python.org にあるPython2.7のドキュメントを参照する必要があります。 設計と実装の理論的根拠を理解したい場合は、特定の新機能または変更が議論された https://bugs.python.org の問題についてPEPを参照してください。 可能な限り、「Pythonの新機能」は各変更のバグ/パッチアイテムにリンクしています。
Python2.xの未来
Python 2.7は、2.xシリーズの最後のメジャーリリースです。Pythonメンテナが新機能開発の焦点をPython3.xシリーズに移したためです。 つまり、Python 2は引き続きバグ修正を受け取り、新しいハードウェアとサポートされているオペレーティングシステムのバージョンで正しくビルドするように更新されますが、言語または標準ライブラリの新しいフル機能リリースはありません。
ただし、Python2.7とPython3の間には大きな共通サブセットがあり、その共通サブセットへの移行、またはPython 3への直接の移行に関連する変更の多くは安全に自動化できますが、その他の変更(特にUnicode処理に関連する変更)もあります。 )効果的に移行するには、慎重に検討する必要があり、できれば堅牢な自動回帰テストスイートが必要になる場合があります。
これは、Python 2.7が長期間使用され、Python3にまだ移植されていない本番システムに安定したサポートされたベースプラットフォームを提供することを意味します。 Python 2.7シリーズの予想される完全なライフサイクルについては、 PEP 373 で詳しく説明されています。
2.7の長期的な重要性のいくつかの重要な結果は次のとおりです。
- 上記のように、2.7リリースでは、以前の2.xバージョンと比較して、メンテナンス期間がはるかに長くなっています。 Python 2.7は現在、少なくとも2020年まで(より一般的なサポート期間である18〜24か月と比較して、最初のリリースから10年後)、コア開発チームによってサポートされ続けると予想されます(セキュリティ更新プログラムやその他のバグ修正を受け取ります)。
- Python 2.7標準ライブラリが古くなるにつれて、Python 2ユーザーにとってPython Package Indexを(直接または再ディストリビューターを介して)効果的に使用することがより重要になります。 さまざまなタスク用のさまざまなサードパーティパッケージに加えて、利用可能なパッケージには、Python2と互換性のあるPython3標準ライブラリの新しいモジュールと機能のバックポート、およびそれを簡単にするさまざまなツールとライブラリが含まれています。 Python3に移行します。 Python Packaging User Guide は、Python PackageIndexからソフトウェアをダウンロードしてインストールするためのガイダンスを提供します。
- Python 2を強化するための推奨されるアプローチは、Python Package Indexでの新しいパッケージの公開ですが、このアプローチは、すべての場合、特にネットワークセキュリティに関連する場合に必ずしも機能するとは限りません。 PyPIで新しいパッケージまたは更新されたパッケージを公開しても適切に処理できない例外的なケースでは、Python拡張提案プロセスを使用して、Python2標準ライブラリに新しい機能を直接追加することを主張できます。 このような追加、およびそれらが追加されたメンテナンスリリースについては、以下の Python2.7メンテナンスリリースに追加された新機能セクションに記載されています。
Python2からPython3への移行を希望するプロジェクト、またはPython2とPython3の両方でユーザーをサポートしたいライブラリおよびフレームワーク開発者向けに、適切なアプローチを決定し、いくつかを管理するのに役立つさまざまなツールとガイドがあります。関連する技術的な詳細。 推奨される出発点は、 Python2コードのPython3への移植 HOWTOガイドです。
非推奨警告の処理の変更
Python 2.7の場合、デフォルトでは開発者のみが関心を持つ警告を消音するというポリシー決定が行われました。 DeprecationWarning とその子孫は、特に要求されない限り無視されるようになり、アプリケーションによってトリガーされた警告がユーザーに表示されなくなりました。 この変更は、Python3.2になったブランチでも行われました。 (stdlib-sigで説明され、:issue: `7319` で実行されます。)
以前のリリースでは、 DeprecationWarning メッセージがデフォルトで有効になっており、Python開発者は、Pythonの将来のメジャーバージョンでコードが破損する可能性がある場所を明確に示すことができます。
ただし、Pythonベースのアプリケーションの開発に直接関与していないユーザーがますます多くなっています。 DeprecationWarning メッセージはそのようなユーザーには関係がないため、実際に正しく動作しているアプリケーションについて心配し、アプリケーション開発者にこれらの懸念への対応に負担をかけます。
DeprecationWarning メッセージの表示を再度有効にするには、Pythonを -Wdefault (短縮形: -Wd )スイッチで実行するか、を設定します。 Pythonを実行する前に、 PYTHONWARNINGS 環境変数を"default"
(または"d"
)に変更します。 Pythonコードは、warnings.simplefilter('default')
を呼び出してそれらを再度有効にすることもできます。
unittest
モジュールは、テストの実行時に非推奨の警告を自動的に再度有効にします。
Python3.1の機能
Python2.6にPython3.0の機能が組み込まれているのと同様に、バージョン2.7にはPython3.1の新機能の一部が組み込まれています。 2.xシリーズは、3.xシリーズに移行するためのツールを引き続き提供します。
2.7にバックポートされた3.1機能の部分的なリスト:
- セットリテラルの構文(
{1,2,3}
は可変セットです)。 - 辞書と集合内包表記(
{i: i*2 for i in range(3)}
)。 - 1つの with ステートメント内の複数のコンテキストマネージャー。
- io ライブラリの新しいバージョンで、パフォーマンスのためにCで書き直されました。
- PEP 372:コレクションへの順序付きディクショナリの追加で説明されている順序付きディクショナリタイプ。
- PEP 378:千の区切り文字のフォーマット指定子で説明されている新しい
","
フォーマット指定子。 - memoryview オブジェクト。
- importlib モジュールの小さなサブセット、以下で説明します。
- 多くの場合、float
x
の repr()は短くなります。これは、x
に丸められることが保証されている最短の10進文字列に基づいています。 以前のバージョンのPythonと同様に、float(repr(x))
がx
を回復することが保証されています。 - 浮動小数点から文字列および文字列から浮動小数点への変換は正しく丸められます。 round()関数も正しく丸められるようになりました。
- PyCapsule タイプ。拡張モジュールにCAPIを提供するために使用されます。
- PyLong_AsLongAndOverflow() CAPI関数。
その他の新しいPython3モードの警告は次のとおりです。
- 3.xでサポートされていない
operator.isCallable()
およびoperator.sequenceIncludes()
は、警告をトリガーするようになりました。 -3
スイッチは、-Qwarn
スイッチを自動的に有効にするようになりました。これにより、整数と長整数での従来の除算の使用に関する警告が表示されます。
PEP 372:コレクションへの順序付き辞書の追加
通常のPython辞書は、キーと値のペアを任意の順序で繰り返し処理します。 何年にもわたって、多くの作成者が、キーが最初に挿入された順序を記憶する代替の実装を作成してきました。 これらの実装の経験に基づいて、2.7では collections モジュールに新しい OrderedDict クラスが導入されています。
OrderedDict APIは、通常の辞書と同じインターフェイスを提供しますが、キーが最初に挿入された日時に応じて、保証された順序でキーと値を繰り返し処理します。
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
新しいエントリが既存のエントリを上書きする場合、元の挿入位置は変更されません。
>>> d['second'] = 4
>>> d.items()
[('first', 1), ('second', 4), ('third', 3)]
エントリを削除して再挿入すると、エントリは最後に移動します。
>>> del d['second']
>>> d['second'] = 5
>>> d.items()
[('first', 1), ('third', 3), ('second', 5)]
popitem()メソッドには、オプションの last 引数があり、デフォルトはTrue
です。 last がtrueの場合、最後に追加されたキーが返され、削除されます。 falseの場合、最も古いキーが選択されます。
>>> od = OrderedDict([(x,0) for x in range(20)])
>>> od.popitem()
(19, 0)
>>> od.popitem()
(18, 0)
>>> od.popitem(last=False)
(0, 0)
>>> od.popitem(last=False)
(1, 0)
2つの順序付けられた辞書を比較すると、キーと値の両方がチェックされ、挿入順序が同じである必要があります。
>>> od1 = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> od2 = OrderedDict([('third', 3),
... ('first', 1),
... ('second', 2)])
>>> od1 == od2
False
>>> # Move 'third' key to the end
>>> del od2['third']; od2['third'] = 3
>>> od1 == od2
True
OrderedDict を通常の辞書と比較すると、挿入順序は無視され、キーと値が比較されるだけです。
OrderedDict はどのように機能しますか? 二重にリンクされたキーのリストを維持し、挿入されるとリストに新しいキーを追加します。 セカンダリディクショナリはキーを対応するリストノードにマップするため、削除はリンクリスト全体をトラバースする必要がないため、O(1)のままになります。
標準ライブラリは、いくつかのモジュールで順序付けられた辞書の使用をサポートするようになりました。
ConfigParser
モジュールはデフォルトでそれらを使用します。つまり、構成ファイルを読み取り、変更してから、元の順序で書き戻すことができるようになりました。- collections.namedtuple()の _asdict()メソッドは、基になるタプルインデックスと同じ順序で表示される値を持つ順序付きディクショナリを返すようになりました。
- json モジュールの JSONDecoder クラスコンストラクターが object_pairs_hook パラメーターで拡張され、
OrderedDict
インスタンスをデコーダーで構築できるようになりました。 PyYAML などのサードパーティツールのサポートも追加されました。
も参照してください
- PEP 372 -順序付けられた辞書をコレクションに追加する
- アーミン・ロンチャーとレイモンド・ヘッティンガーによって書かれたPEP。 RaymondHettingerによって実装されました。
PEP 378:数千の区切り文字のフォーマット指定子
プログラム出力を読みやすくするには、大きな数に区切り文字を追加して、18446744073709551616ではなく18,446,744,073,709,551,616としてレンダリングすると便利です。
これを行うための完全に一般的なソリューションは、 locale モジュールです。これは、さまざまな区切り文字(北米では「、」、ヨーロッパでは「。」)とさまざまなグループ化サイズを使用できますが、 locale 使用が複雑で、さまざまなスレッドがさまざまなロケールの出力を生成するマルチスレッドアプリケーションには適していません。
そのため、 str.format()メソッドで使用されるミニ言語に単純なコンマグループ化メカニズムが追加されました。 浮動小数点数をフォーマットするときは、幅と精度の間にコンマを含めるだけです。
>>> '{:20,.2f}'.format(18446744073709551616.0)
'18,446,744,073,709,551,616.00'
整数をフォーマットするときは、幅の後にコンマを含めます。
>>> '{:20,d}'.format(18446744073709551616)
'18,446,744,073,709,551,616'
このメカニズムはまったく適応できません。 区切り文字として常にコンマが使用され、グループ化は常に3桁のグループになります。 カンマフォーマットのメカニズムは、 locale モジュールほど一般的ではありませんが、使いやすいです。
PEP 389:コマンドラインを解析するためのargparseモジュール
optparse モジュールのより強力な代替として、コマンドライン引数を解析するための argparse モジュールが追加されました。
つまり、Pythonは、コマンドライン引数を解析するために、 getopt 、 optparse 、および argparse の3つの異なるモジュールをサポートするようになりました。 getopt モジュールは、Cライブラリのgetopt()
関数によく似ているため、最終的にCで書き直されるPythonプロトタイプを作成する場合に役立ちます。 optparse は冗長になりますが、まだ使用しているスクリプトが多数あり、これらのスクリプトを自動更新する方法がないため、削除する予定はありません。 ( argparse APIを optparse のインターフェースと整合させることについては議論されましたが、面倒で難しいとして却下されました。)
つまり、新しいスクリプトを作成していて、以前のバージョンのPythonとの互換性について心配する必要がない場合は、 optparse の代わりに argparse を使用してください。
次に例を示します。
import argparse
parser = argparse.ArgumentParser(description='Command-line example.')
# Add optional switches
parser.add_argument('-v', action='store_true', dest='is_verbose',
help='produce verbose output')
parser.add_argument('-o', action='store', dest='output',
metavar='FILE',
help='direct output to FILE instead of stdout')
parser.add_argument('-C', action='store', type=int, dest='context',
metavar='NUM', default=0,
help='display NUM lines of added context')
# Allow any number of additional arguments.
parser.add_argument(nargs='*', action='store', dest='inputs',
help='input filenames (default is stdin)')
args = parser.parse_args()
print args.__dict__
オーバーライドしない限り、-h
および--help
スイッチが自動的に追加され、きちんとフォーマットされた出力が生成されます。
-> ./python.exe argparse-example.py --help
usage: argparse-example.py [-h] [-v] [-o FILE] [-C NUM] [inputs [inputs ...]]
Command-line example.
positional arguments:
inputs input filenames (default is stdin)
optional arguments:
-h, --help show this help message and exit
-v produce verbose output
-o FILE direct output to FILE instead of stdout
-C NUM display NUM lines of added context
optparse と同様に、コマンドラインスイッチと引数は dest パラメーターで指定された属性を持つオブジェクトとして返されます。
-> ./python.exe argparse-example.py -v
{'output': None,
'is_verbose': True,
'context': 0,
'inputs': []}
-> ./python.exe argparse-example.py -v -o /tmp/output -C 4 file1 file2
{'output': '/tmp/output',
'is_verbose': True,
'context': 4,
'inputs': ['file1', 'file2']}
argparse は、 optparse よりもはるかに優れた検証機能を備えています。 引数の正確な数を整数、'*'
を渡すことで0個以上、'+'
を渡すことで1個以上、または'?'
でオプションの引数として指定できます。 トップレベルパーサーには、svn commit
、svn checkout
などのように、スイッチの異なるセットを持つサブコマンドを定義するサブパーサーを含めることができます。 引数のタイプを FileType として指定できます。これにより、ファイルが自動的に開かれ、'-'
が標準の入力または出力を意味することが理解されます。
も参照してください
- argparse のドキュメント
- argparseモジュールのドキュメントページ。
- optparseコードのアップグレード
- optparse を使用するコードを変換する方法を説明するPythonドキュメントの一部。
- PEP 389 -argparse-新しいコマンドライン解析モジュール
- スティーブン・ベットハルトによって書かれ、実装されたPEP。
PEP 391:ロギング用の辞書ベースの構成
logging モジュールは非常に柔軟性があります。 アプリケーションはロギングサブシステムのツリーを定義でき、このツリーの各ロガーは特定のメッセージをフィルターで除外し、それらを異なる形式でフォーマットし、メッセージをさまざまな数のハンドラーに送信できます。
このすべての柔軟性には、多くの構成が必要になる場合があります。 Pythonステートメントを記述してオブジェクトを作成し、そのプロパティを設定できますが、複雑なセットアップには、冗長で退屈なコードが必要です。 logging は、ファイルを解析するfileConfig()
関数もサポートしていますが、ファイル形式はフィルターの構成をサポートしておらず、プログラムで生成するのは面倒です。
Python 2.7は、辞書を使用してロギングを構成するdictConfig()
関数を追加します。 さまざまなソースから辞書を作成する方法はたくさんあります。コードを使用して辞書を作成します。 JSONを含むファイルを解析します。 または、YAML解析ライブラリがインストールされている場合はそれを使用します。 詳細については、構成関数を参照してください。
次の例では、ルートロガーと「network」という名前のロガーの2つのロガーを構成します。 ルートロガーに送信されたメッセージはsyslogプロトコルを使用してシステムログに送信され、「ネットワーク」ロガーへのメッセージはnetwork.log
ファイルに書き込まれ、ログが1MBに達するとローテーションされます。
import logging
import logging.config
configdict = {
'version': 1, # Configuration schema in use; must be 1 for now
'formatters': {
'standard': {
'format': ('%(asctime)s %(name)-15s '
'%(levelname)-8s %(message)s')}},
'handlers': {'netlog': {'backupCount': 10,
'class': 'logging.handlers.RotatingFileHandler',
'filename': '/logs/network.log',
'formatter': 'standard',
'level': 'INFO',
'maxBytes': 1000000},
'syslog': {'class': 'logging.handlers.SysLogHandler',
'formatter': 'standard',
'level': 'ERROR'}},
# Specify all the subordinate loggers
'loggers': {
'network': {
'handlers': ['netlog']
}
},
# Specify properties of the root logger
'root': {
'handlers': ['syslog']
},
}
# Set up configuration
logging.config.dictConfig(configdict)
# As an example, log two error messages
logger = logging.getLogger('/')
logger.error('Database not found')
netlogger = logging.getLogger('network')
netlogger.error('Connection failed')
logging モジュールの3つの小さな拡張機能は、すべてVinaySajipによって実装されています。
- SysLogHandler クラスは、TCPを介したsyslogをサポートするようになりました。 コンストラクターには、使用するソケットのタイプを指定する socktype パラメーターがあります。UDPの場合は socket.SOCK_DGRAM 、TCPの場合は socket.SOCK_STREAM です。 デフォルトのプロトコルはUDPのままです。
- Logger インスタンスは、相対パスを使用して子孫ロガーを取得する getChild()メソッドを取得しました。 たとえば、
log = getLogger('app')
を実行してロガーを取得した後、log.getChild('network.listen')
を呼び出すことはgetLogger('app.network.listen')
と同等です。 - LoggerAdapter クラスは、 level を取り、基になるロガーがその重要度のメッセージを処理するかどうかを返す
isEnabledFor()
メソッドを取得しました。
PEP 3106:辞書ビュー
辞書メソッド keys()、 values()、および items()は、Python3.xでは異なります。 完全にマテリアライズされたリストではなく、 view というオブジェクトを返します。
Python 2.7では、 keys()、 values()、および items()の戻り値を変更することはできません。これは、コードが多すぎると破損するためです。 代わりに、3.xバージョンが新しい名前viewkeys()
、viewvalues()
、およびviewitems()
で追加されました。
>>> d = dict((i*10, chr(65+i)) for i in range(26))
>>> d
{0: 'A', 130: 'N', 10: 'B', 140: 'O', 20: ..., 250: 'Z'}
>>> d.viewkeys()
dict_keys([0, 130, 10, 140, 20, 150, 30, ..., 250])
ビューは繰り返すことができますが、キービューとアイテムビューもセットのように動作します。 &
演算子は共通部分を実行し、|
は和集合を実行します。
>>> d1 = dict((i*10, chr(65+i)) for i in range(26))
>>> d2 = dict((i**.5, i) for i in range(1000))
>>> d1.viewkeys() & d2.viewkeys()
set([0.0, 10.0, 20.0, 30.0])
>>> d1.viewkeys() | range(0, 30)
set([0, 1, 130, 3, 4, 5, 6, ..., 120, 250])
ビューは辞書を追跡し、辞書が変更されるとその内容が変更されます。
>>> vk = d.viewkeys()
>>> vk
dict_keys([0, 130, 10, ..., 250])
>>> d[260] = '&'
>>> vk
dict_keys([0, 130, 260, 10, ..., 250])
ただし、ビューを繰り返し処理している間は、キーを追加または削除できないことに注意してください。
>>> for k in vk:
... d[k*2] = k
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
Python 2.xコードでviewメソッドを使用でき、2to3コンバーターはそれらを標準の keys()、 values()、および items()に変更します。 メソッド。
も参照してください
- PEP 3106 -dict.keys()、. values()、および.items()の刷新
- グイドヴァンロッサムによって書かれたPEP。 AlexandreVassalottiによって2.7にバックポートされました。 :issue: `1967` 。
PEP 3137:memoryviewオブジェクト
memoryview オブジェクトは、 bytes タイプのインターフェイスに一致する別のオブジェクトのメモリコンテンツのビューを提供します。
>>> import string
>>> m = memoryview(string.letters)
>>> m
<memory at 0x37f850>
>>> len(m) # Returns length of underlying object
52
>>> m[0], m[25], m[26] # Indexing returns one byte
('a', 'z', 'A')
>>> m2 = m[0:26] # Slicing returns another memoryview
>>> m2
<memory at 0x37f080>
ビューのコンテンツは、バイトの文字列または整数のリストに変換できます。
>>> m2.tobytes()
'abcdefghijklmnopqrstuvwxyz'
>>> m2.tolist()
[97, 98, 99, 100, 101, 102, 103, ... 121, 122]
>>>
memoryview オブジェクトを使用すると、基になるオブジェクトが可変オブジェクトの場合に変更できます。
>>> m2[0] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cannot modify read-only memory
>>> b = bytearray(string.letters) # Creating a mutable object
>>> b
bytearray(b'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')
>>> mb = memoryview(b)
>>> mb[0] = '*' # Assign to view, changing the bytearray.
>>> b[0:5] # The bytearray has been changed.
bytearray(b'*bcde')
>>>
も参照してください
- PEP 3137 -不変バイトと可変バッファ
- グイドヴァンロッサムによって書かれたPEP。 Travis Oliphant、AntoinePitrouなどによって実装されました。 AntoinePitrouによって2.7にバックポートされました。 :issue: `2396` 。
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
セットリテラルの構文は、Python3.xからバックポートされています。 中括弧は、結果の可変セットの内容を囲むために使用されます。 セットリテラルは、コロンと値を含まないことで辞書と区別されます。
{}
は引き続き空の辞書を表します。 空のセットにはset()
を使用します。>>> {1, 2, 3, 4, 5} set([1, 2, 3, 4, 5]) >>> set() # empty set set([]) >>> {} # empty dict {}
AlexandreVassalottiによってバックポートされました。 :issue: `2335` 。
辞書と集合の内包表記は、3.xからバックポートされた別の機能であり、リスト/ジェネレーターの内包表記を一般化して、集合と辞書の文字通りの構文を使用します。
>>> {x: x*x for x in range(6)} {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25} >>> {('a'*x) for x in range(6)} set(['', 'a', 'aa', 'aaa', 'aaaa', 'aaaaa'])
AlexandreVassalottiによってバックポートされました。 :issue: `2333` 。
with ステートメントで、1つのステートメントで複数のコンテキストマネージャーを使用できるようになりました。 コンテキストマネージャーは左から右に処理され、それぞれが新しい
with
ステートメントの開始として扱われます。 この意味は:with A() as a, B() as b: ... suite of statements ...
と同等です:
with A() as a: with B() as b: ... suite of statements ...
contextlib.nested()
関数は非常によく似た関数を提供するため、不要になり、非推奨になりました。( https://codereview.appspot.com/53094 で提案され、Georg Brandlによって実装されました。)
浮動小数点数と文字列の間の変換は、ほとんどのプラットフォームで正しく丸められるようになりました。 これらの変換は、さまざまな場所で発生します。フロートおよび複素数の str()。 float および complex コンストラクター。 数値フォーマット; marshal 、 pickle 、および json モジュールを使用して、浮動小数点数と複素数をシリアル化および逆シリアル化します。 Pythonコードでのfloatおよび虚数リテラルの解析。 および Decimal からfloatへの変換。
これに関連して、浮動小数点数 x の repr()は、 x に丸められることが保証されている最短の10進文字列に基づく結果を返すようになりました。正しい丸めの下で(丸めの半分から偶数の丸めモードを使用)。 以前は、xを10進数の17桁に丸めることに基づいて文字列を提供していました。
この改善を担当する丸めライブラリは、gcc、icc、またはsunccコンパイラを使用するWindowsおよびUnixプラットフォームで機能します。 このコードの正しい動作が保証されないプラットフォームが少数ある可能性があるため、このようなシステムではコードは使用されません。 sys.float_repr_style を確認すると、使用されているコードを確認できます。新しいコードが使用されている場合は
short
、使用されていない場合はlegacy
になります。DavidGayの
dtoa.c
ライブラリを使用して、EricSmithとMarkDickinsonによって実装されました。 :issue: `7117` 。長整数および通常の整数から浮動小数点への変換が異なる方法で丸められるようになり、数値に最も近い浮動小数点数が返されます。 これは、正確に変換できる小さな整数の場合は問題ではありませんが、必然的に精度が低下する大きな数値の場合、Python2.7はより厳密に近似するようになりました。 たとえば、Python2.6は次のように計算しました。
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935283e+20 >>> n - long(float(n)) 65535L
Python 2.7の浮動小数点の結果は大きくなりますが、真の値にはるかに近くなります。
>>> n = 295147905179352891391 >>> float(n) 2.9514790517935289e+20 >>> n - long(float(n)) -1L
(MarkDickinsonによって実装されました; :issue: `3166` 。)
整数除算は、丸め動作もより正確です。 (MarkDickinsonによっても実装されています; :issue: `1811` 。)
複素数に対する暗黙の強制は削除されました。 インタプリタは、複雑なオブジェクトに対して
__coerce__()
メソッドを呼び出そうとはしなくなりました。 (MeadorIngeとMarkDickinsonによって削除されました; :issue: `5211` 。)str.format()メソッドは、置換フィールドの自動番号付けをサポートするようになりました。 これにより、 str.format()の使用は、
%s
フォーマットの使用により近くなります。>>> '{}:{}:{}'.format(2009, 04, 'Sunday') '2009:4:Sunday' >>> '{}:{}:{day}'.format(2009, 4, day='Sunday') '2009:4:Sunday'
自動番号付けはフィールドを左から右に取るため、最初の
{...}
指定子は str.format()の最初の引数を使用し、次の指定子は次の引数を使用し、すぐ。 自動番号付けと明示的な番号付けを混在させることはできません。指定子フィールドのすべてに番号を付けるか、まったく番号を付けませんが、上記の2番目の例のように、自動番号付けフィールドと名前付きフィールドを混在させることはできます。 (EricSmithによる寄稿; :issue: `5237` 。)複素数は format()での使用を正しくサポートするようになり、デフォルトでは右揃えになります。 精度またはコンマ区切りを指定すると、数値の実数部と虚数部の両方に適用されますが、指定されたフィールド幅と配置は、結果の
1.5+3j
出力全体に適用されます。 (EricSmithによる寄稿; :issue: `1588` および:issue:` 7988` 。)「F」フォーマットコードは、常に大文字を使用して出力をフォーマットするようになったため、「INF」と「NAN」を生成するようになりました。 (EricSmithによる寄稿; :issue: `3382` 。)
低レベルの変更: object .__ format __()メソッドは、オブジェクトの
__format__()
メソッドが原因で、フォーマット文字列が渡された場合に PendingDeprecationWarning をトリガーするようになりました。 は、オブジェクトを文字列表現に変換し、それをフォーマットします。 以前は、メソッドはフォーマット文字列を文字列表現にサイレントに適用していましたが、Pythonコードの間違いを隠すことができました。 配置や精度などの書式設定情報を提供する場合は、おそらく、書式設定がオブジェクト固有の方法で適用されることを期待しています。 (EricSmithによる修正; :issue: `7994` 。)int()および
long()
タイプは、引数をバイナリで表すために必要なビット数を返すbit_length
メソッドを取得しました。>>> n = 37 >>> bin(n) '0b100101' >>> n.bit_length() 6 >>> n = 2**123-1 >>> n.bit_length() 123 >>> (n+1).bit_length() 124
(FredrikJohanssonとVictorStinnerによる寄稿; :issue: `3439` 。)
import ステートメントは、相対インポートの場合、絶対インポートを試行しなくなりました(例:
from .os import sep
)は失敗します。 これによりバグが修正されますが、偶然にしか機能しなかった特定のimport
ステートメントが破損する可能性があります。 (MeadorIngeによって修正されました; :issue: `7902` 。)組み込みの
unicode
タイプのサブクラスが__unicode__()
メソッドをオーバーライドできるようになりました。 (VictorStinnerによって実装されました; :issue: `1583863` 。)bytearray タイプの translate()メソッドは、最初の引数として
None
を受け入れるようになりました。 (GeorgBrandlによる修正; :issue: `4759` 。)@classmethod
および@staticmethod
を使用してメソッドをクラスまたは静的メソッドとしてラップする場合、ラッパーオブジェクトはラップされた関数を__func__
属性として公開するようになりました。 (George Sakkisによる提案の後、Amaury Forgeotd'Arcによって寄稿されました; :issue: `5982` 。)__slots__
を使用して制限された属性のセットが設定された場合、未設定の属性を削除しても、期待どおりに AttributeError は発生しません。 ベンジャミンピーターソンによって修正されました。 :issue: `7604` 。)2つの新しいエンコーディングがサポートされるようになりました。「cp720」。主にアラビア語のテキストに使用されます。 ユーロ記号を追加したCP850の変形である「cp858」。 (CP720は:issue: `1616979` でAlexanderBelchenkoとAmauryForgeot d'Arcによって寄稿されました; CP858は:issue:` 8016` でTimHatchによって寄稿されました。)
file
オブジェクトは、POSIXプラットフォームでディレクトリを開こうとしたときに IOError 例外にfilename
属性を設定するようになりました(Jan Kaliszewski、:issue: `4764` )、エラーをキャッチして報告するためにCライブラリを信頼する代わりに、読み取り専用ファイルオブジェクトへの書き込みを明示的にチェックして禁止するようになりました(StefanKrahによって修正されました; :issue:` 5677` [ X375X])。Pythonトークナイザーは行末自体を変換するようになったため、 compile()組み込み関数は、任意の行末規則を使用してコードを受け入れるようになりました。 さらに、コードが改行で終わる必要がなくなりました。
Python 3.xでは、関数定義の余分な括弧は無効です。つまり、
def f((x)): pass
から構文エラーが発生します。 Python3警告モードでは、Python2.7はこの奇妙な使用法について警告するようになりました。 (JamesLingardによる注記; :issue: `7362` 。)古いスタイルのクラスオブジェクトへの弱参照を作成できるようになりました。 新しいスタイルのクラスは常に弱い参照可能でした。 (AntoinePitrouによって修正されました; :issue: `8268` 。)
モジュールオブジェクトがガベージコレクションされると、モジュールのディクショナリは、他の誰もディクショナリへの参照を保持していない場合にのみクリアされるようになりました(:issue: `7140` )。
通訳の変更
新しい環境変数 PYTHONWARNINGS を使用すると、警告を制御できます。 -W スイッチで使用されるものと同等の警告設定を含む文字列に、カンマで区切って設定する必要があります。 (BrianCurtinによる寄稿; :issue: `7301` 。)
たとえば、次の設定では、警告が発生するたびに警告が出力されますが、Cookie
モジュールからの警告はエラーになります。 (環境変数を設定するための正確な構文は、オペレーティングシステムとシェルによって異なります。)
export PYTHONWARNINGS=all,error:::Cookie:0
最適化
いくつかのパフォーマンスの強化が追加されました。
with ステートメントの初期セットアップを実行するために、
__enter__()
および__exit__()
メソッドを検索する新しいオペコードが追加されました。 (Benjamin Petersonによる寄稿。)ガベージコレクターは、1つの一般的な使用パターン、つまり、オブジェクトの割り当てを解除せずに多くのオブジェクトが割り当てられている場合に、パフォーマンスが向上するようになりました。 以前はガベージコレクションに2次の時間がかかりましたが、ヒープ上のオブジェクトの数が増えるにつれて、完全なガベージコレクションの数が減ります。 新しいロジックは、中間世代が10回収集され、中間世代のサバイバーオブジェクトの数が最も古い世代のオブジェクトの数の10 % oを超えた場合にのみ、完全なガベージコレクションパスを実行します。 (MartinvonLöwisによって提案され、AntoinePitrouによって実装されました; :issue: `4074` 。)
ガベージコレクターは、サイクルの一部になり得ない単純なコンテナーの追跡を回避しようとします。 Python 2.7では、これはアトミック型(int、stringsなど)を含むタプルとdictに当てはまります。 推移的には、アトミックタイプのタプルを含むdictも追跡されません。 これは、コレクターによって考慮およびトラバースされるオブジェクトの数を減らすことにより、各ガベージコレクションのコストを削減するのに役立ちます。 (AntoinePitrouによる寄稿; :issue: `4688` 。)
長整数は、基数2 ** 15または基数2 ** 30のいずれかに内部的に格納されるようになり、基数はビルド時に決定されます。 以前は、それらは常に基数2 ** 15に格納されていました。 ベース2 ** 30を使用すると、64ビットマシンでパフォーマンスが大幅に向上しますが、32ビットマシンでのベンチマーク結果はまちまちです。 したがって、デフォルトでは、64ビットマシンではベース2 ** 30を使用し、32ビットマシンではベース2 ** 15を使用します。 Unixでは、このデフォルトをオーバーライドするために使用できる新しい構成オプション
--enable-big-digits
があります。パフォーマンスの向上とは別に、この変更はエンドユーザーには見えないはずです。ただし、テストとデバッグの目的で、内部形式に関する情報を提供する新しいstructseq
sys.long_info
があり、1桁あたりのビット数と各桁の格納に使用されるCタイプのバイト単位のサイズ:>>> import sys >>> sys.long_info sys.long_info(bits_per_digit=30, sizeof_digit=4)
(MarkDickinsonによる寄稿; :issue: `4258` 。)
別の一連の変更により、長いオブジェクトが数バイト小さくなりました。32ビットシステムでは2バイト小さく、64ビットシステムでは6バイト小さくなりました。 (MarkDickinsonによる寄稿; :issue: `5260` 。)
長整数の除算アルゴリズムは、内側のループを引き締め、乗算の代わりにシフトを実行し、不要な余分な反復を修正することにより、より高速になりました。 さまざまなベンチマークは、長整数の除算とモジュロ演算で50%から150%のスピードアップを示しています。 (MarkDickinsonによる寄稿; :issue: `5512` 。)ビット演算も大幅に高速化されています(GregorySmithによる初期パッチ; :issue:` 1087418` )。
%
の実装は、左側のオペランドがPython文字列であることを確認し、特殊なケースを使用します。 これにより、テンプレートライブラリなど、文字列で%
を頻繁に使用するアプリケーションのパフォーマンスが1〜3%向上します。 (CollinWinterによって実装されました; :issue: `5176` 。)if
条件のリスト内包表記は、より高速なバイトコードにコンパイルされます。 (Antoine Pitrouによるパッチ、JeffreyYasskinによる2.7へのバックポート; :issue: `4715` 。)整数または長整数から10進文字列への変換は、任意の基数をサポートする一般化された変換関数を使用する代わりに、基数10を特殊なケースにすることで高速化されました。 (GawainBoltonによるパッチ; :issue: `6713` 。)
文字列のような型(文字列、Unicode文字列、および[ X122X] bytearray オブジェクト)は、文字ごとのスキャンではなく、高速逆検索アルゴリズムを使用するようになりました。 これは、10倍速い場合があります。 (FlorentXiclunaによって追加されました; :issue: `7462` および:issue:` 7622` 。)
pickle および
cPickle
モジュールは、属性名に使用される文字列を自動的にインターンし、選択解除によるオブジェクトのメモリ使用量を削減するようになりました。 (JakeMcGuireによる寄稿; :issue: `5084` 。)cPickle
モジュールは、特殊なケースの辞書になり、それらをピクルスにするのに必要な時間をほぼ半分にしました。 (CollinWinterによる寄稿; :issue: `5670` 。)
新規および改善されたモジュール
すべてのリリースと同様に、Pythonの標準ライブラリには多くの機能拡張とバグ修正が含まれています。 これは、モジュール名のアルファベット順にソートされた、最も注目すべき変更の部分的なリストです。 変更のより完全なリストについては、ソースツリーのMisc/NEWS
ファイルを参照するか、すべての詳細についてSubversionログを調べてください。
bdb モジュールの基本デバッグクラス Bdb には、モジュールをスキップする機能が追加されました。 コンストラクターは、
django.*
などのグロブスタイルのパターンを含む反復可能オブジェクトを受け取るようになりました。 デバッガーは、これらのパターンの1つに一致するモジュールからスタックフレームにステップインしません。 (SenthilKumaranによる提案の後にMaruNewbyによって寄稿されました; :issue: `5142` 。)binascii モジュールはバッファAPIをサポートするようになったため、 memoryview インスタンスやその他の同様のバッファオブジェクトで使用できます。 (FlorentXiclunaによって3.xからバックポートされました; :issue: `7703` 。)
更新されたモジュール:
bsddb
モジュールが4.7.2devel9から pybsddbパッケージのバージョン4.8.4に更新されました。 新しいバージョンは、Python 3.xとの互換性が向上し、さまざまなバグが修正され、いくつかの新しいBerkeleyDBフラグとメソッドが追加されています。 (JesúsCeaAviónによって更新; :issue: `8156` 。 pybsddbの変更ログは、 http://hg.jcea.es/pybsddb/file/tip/ChangeLog で読み取ることができます。)bz2 モジュールの BZ2File がコンテキスト管理プロトコルをサポートするようになったため、
with bz2.BZ2File(...) as f:
と記述できます。 (HagenFürstenauによる寄稿; :issue: `3860` 。)新しいクラス: collections モジュールの Counter クラスは、データの集計に役立ちます。 Counter インスタンスはほとんど辞書のように動作しますが、 KeyError を発生させる代わりに、欠落しているキーに対してゼロを返します。
>>> from collections import Counter >>> c = Counter() >>> for letter in 'here is a sample of english text': ... c[letter] += 1 ... >>> c Counter({' ': 6, 'e': 5, 's': 3, 'a': 2, 'i': 2, 'h': 2, 'l': 2, 't': 2, 'g': 1, 'f': 1, 'm': 1, 'o': 1, 'n': 1, 'p': 1, 'r': 1, 'x': 1}) >>> c['e'] 5 >>> c['z'] 0
3つの追加の Counter メソッドがあります。 most_common()は、N個の最も一般的な要素とその数を返します。 elements()は、含まれている要素に対してイテレータを返し、各要素をそのカウント回数だけ繰り返します。 extract()は反復可能であり、加算する代わりに要素ごとに1を減算します。 引数が辞書または別の
Counter
の場合、カウントが減算されます。>>> c.most_common(5) [(' ', 6), ('e', 5), ('s', 3), ('a', 2), ('i', 2)] >>> c.elements() -> 'a', 'a', ' ', ' ', ' ', ' ', ' ', ' ', 'e', 'e', 'e', 'e', 'e', 'g', 'f', 'i', 'i', 'h', 'h', 'm', 'l', 'l', 'o', 'n', 'p', 's', 's', 's', 'r', 't', 't', 'x' >>> c['e'] 5 >>> c.subtract('very heavy on the letter e') >>> c['e'] # Count is now lower -1
RaymondHettingerによる寄稿。 :issue: `1696199` 。
新しいクラス: OrderedDict は、前のセクション PEP 372:コレクションへの順序付きディクショナリの追加で説明されています。
新しいメソッド: deque データ型に、指定された引数 x に等しい含まれる要素の数を返す count()メソッドと[X170X ] reverse()メソッドは、両端キューの要素をインプレースで反転します。 deque は、その最大長も読み取り専用の maxlen 属性として公開します。 (両方の機能はRaymond Hettingerによって追加されました。)
namedtuple クラスに、オプションの rename パラメーターが追加されました。 rename がtrueの場合、繰り返されたために無効なフィールド名、または正当なPython識別子ではないフィールド名は、フィールドのリスト内のフィールドの位置から派生した正当な名前に名前が変更されます。
>>> from collections import namedtuple >>> T = namedtuple('T', ['field1', '$illegal', 'for', 'field2'], rename=True) >>> T._fields ('field1', '_1', '_2', 'field2')
(RaymondHettingerによって追加されました; :issue: `1818` 。)
最後に、
Mapping
抽象基本クラスは、マッピングがMapping
ではない別の型と比較された場合、 NotImplemented を返すようになりました。 (DanielStutzbachによる修正; :issue: `8729` 。)ConfigParser
モジュールの解析クラスのコンストラクターは、 allow_no_value パラメーターを受け取るようになりました。デフォルトはfalseです。 trueの場合、値のないオプションが許可されます。 例えば:>>> import ConfigParser, StringIO >>> sample_config = """ ... [mysqld] ... user = mysql ... pid-file = /var/run/mysqld/mysqld.pid ... skip-bdb ... """ >>> config = ConfigParser.RawConfigParser(allow_no_value=True) >>> config.readfp(StringIO.StringIO(sample_config)) >>> config.get('mysqld', 'user') 'mysql' >>> print config.get('mysqld', 'skip-bdb') None >>> print config.get('mysqld', 'unknown') Traceback (most recent call last): ... NoOptionError: No option 'unknown' in section: 'mysqld'
(MatsKindahlによる寄稿; :issue: `7005` 。)
非推奨の関数:
with
ステートメントが複数のコンテキストマネージャーをサポートするようになったため、1つの with ステートメントで複数のコンテキストマネージャーを処理できるcontextlib.nested()
は非推奨になりました。cookielib
モジュールは、整数値を含まない無効なバージョンフィールドを持つCookieを無視するようになりました。 (JohnJによって修正されました。 リー; :issue: `3924` 。)copy モジュールの deepcopy()関数は、バインドされたインスタンスメソッドを正しくコピーするようになりました。 (RobertCollinsによって実装されました; :issue: `1515` 。)
ctypes モジュールは、ポインターとして宣言された引数に対して、常に
None
をCNULL
ポインターに変換するようになりました。 (ThomasHellerによって変更されました; :issue: `4606` 。)基盤となる libffiライブラリがバージョン3.0.9に更新され、さまざまなプラットフォームのさまざまな修正が含まれています。 (MatthiasKloseによって更新; :issue: `8142` 。)新しいメソッド: datetime モジュールの timedelta クラスは、期間の秒数を返す total_seconds()メソッドを取得しました。 (BrianQuinlanによる寄稿; :issue: `5788` 。)
新しいメソッド: Decimal クラスは、浮動小数点数から Decimal への正確な変換を実行する from_float()クラスメソッドを取得しました。 この正確な変換は、浮動小数点表現の値に最も近い10進近似を目指します。 したがって、結果の10進値には、不正確さが含まれます。 たとえば、
Decimal.from_float(0.1)
はDecimal('0.1000000000000000055511151231257827021181583404541015625')
を返します。 (RaymondHettingerによって実装されました; :issue: `4796` 。)Decimal のインスタンスを浮動小数点数と比較すると、オペランドの数値に基づいて適切な結果が得られるようになりました。 以前は、このような比較は、オブジェクトを比較するためのPythonのデフォルトのルールにフォールバックし、オブジェクトのタイプに基づいて任意の結果を生成していました。 floatと Decimal の間の変換方法を明示的に選択する必要があるため、加算などの他の操作で
Decimal
と浮動小数点を組み合わせることができないことに注意してください。 (MarkDickinsonによって修正されました; :issue: `2531` 。)Decimal のコンストラクターは、浮動小数点数(RaymondHettingerによって追加; :issue: `8257` )およびアラビア数字(寄稿者)などの非ヨーロッパUnicode文字を受け入れるようになりました。 Mark Dickinson; :issue: `6595` )。
Context クラスのほとんどのメソッドは、 Decimal インスタンスだけでなく整数も受け入れるようになりました。 唯一の例外は、 canonical()メソッドと is_canonical()メソッドです。 (JuanJoséContiによるパッチ; :issue: `7633` 。)
文字列の format()メソッドで Decimal インスタンスを使用する場合、デフォルトの配置は以前は左配置でした。 これは、数値型により適した右揃えに変更されました。 (MarkDickinsonによって変更されました; :issue: `6857` 。)
シグナリングNaN値(または
sNAN
)を含む比較では、比較演算子に応じてtrueまたはfalseの値をサイレントに返すのではなく、InvalidOperation
にシグナリングするようになりました。 静かなNaN値(またはNaN
)がハッシュ可能になりました。 (MarkDickinsonによって修正されました; :issue: `7279` 。)difflib モジュールは、スペースの代わりにタブ文字を使用して、1つの小さな変更で、最新の diff / patch ツールとより互換性のある出力を生成するようになりました。ファイル名を示すヘッダー。 (AnatolyTechtonikによって修正されました; :issue: `7585` 。)
MANIFEST.in
またはsetup.py
ファイルが変更されていない場合でも、ユーザーが作成した可能性があるため、Distutilssdist
コマンドは常にMANIFEST
ファイルを再生成するようになりました。含める必要のあるいくつかの新しいファイル。 (TarekZiadéによる修正; :issue: `8688` 。)doctest モジュールの
IGNORE_EXCEPTION_DETAIL
フラグは、テスト対象の例外を含むモジュールの名前を無視するようになりました。 (LennartRegebroによるパッチ; :issue: `7490` 。)email モジュールの Message クラスは、Unicode値のペイロードを受け入れ、ペイロードを
output_charset
で指定されたエンコーディングに自動的に変換します。 (Rによって追加されました。 デビッドマレー; :issue: `1368247` 。)Fraction クラスは、コンストラクターへの引数として、単一のfloatまたは Decimal インスタンス、または2つの有理数を受け入れるようになりました。 (Mark Dickinsonによって実装され、:issue: `5812` に有理数が追加され、:issue:` 8294` に浮動小数点/小数が追加されました。)
分数と複素数の順序比較(
<
、<=
、>
、>=
)で、 TypeError が発生するようになりました。 これにより見落としが修正され、分数が他の数値型と一致するようになります。新しいクラス: ftplib モジュールの FTP_TLS は、認証のTLSカプセル化と、その後の制御およびデータ転送を使用して、安全なFTP接続を提供します。 (GiampaoloRodolaによる寄稿; :issue: `2054` 。)
バイナリアップロードの storbinary()メソッドは、追加された rest パラメーターのおかげでアップロードを再開できるようになりました(PabloMouzoによるパッチ; :issue: `6845` )。
新しいクラスデコレータ: functools モジュールの total_ordering()は、
__eq__()
メソッドと__lt__()
、 [のいずれかを定義するクラスを取ります。 X153X]、__gt__()
、または__ge__()
であり、欠落している比較メソッドを生成します。__cmp__()
メソッドはPython3.xで非推奨になっているため、このデコレータを使用すると、順序付けられたクラスを簡単に定義できます。 (RaymondHettingerによって追加されました; :issue: `5479` 。)新しい関数: cmp_to_key()は、2つの引数を期待する古いスタイルの比較関数を受け取り、 key パラメーターとして使用できる新しいcallableをなどの関数に返します。ソート済み()、 min()、 max()など。 主な使用目的は、コードをPython3.xと互換性のあるものにすることです。 (Raymond Hettingerによって追加されました。)
新しい関数: gc モジュールの is_tracked()は、特定のインスタンスがガベージコレクターによって追跡されている場合はtrueを返し、それ以外の場合はfalseを返します。 (AntoinePitrouによる寄稿; :issue: `4688` 。)
gzip モジュールの GzipFile がコンテキスト管理プロトコルをサポートするようになったため、
with gzip.GzipFile(...) as f:
(HagenFürstenauによる寄稿; :issue: `3860` [X168X ])、 io.BufferedIOBase ABCを実装するようになったため、 io.BufferedReader でラップして、処理を高速化できます(NirAidesによる寄稿; :issue: ` 7471` )。 オプションのタイムスタンプをコンストラクターに提供することで、gzip圧縮ファイルに記録された変更時間をオーバーライドすることもできるようになりました。 (JacquesFrechetによる寄稿; :issue: `4272` 。)gzip形式のファイルには、末尾のゼロバイトを埋め込むことができます。 gzip モジュールはこれらの末尾のバイトを消費するようになりました。 (TadekPietraszekとBrianCurtinによって修正されました; :issue: `2846` 。)
新しい属性: hashlib モジュールに、サポートされているアルゴリズムに名前を付けるタプルを含む
algorithms
属性が追加されました。 Python 2.7では、hashlib.algorithms
には('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
が含まれています。 (CarlChenetによる寄稿; :issue: `7418` 。)httplib
モジュールで使用されるデフォルトのHTTPResponse
クラスがバッファリングをサポートするようになり、HTTP応答の読み取りが大幅に高速化されました。 (KristjánValurJónssonによる寄稿; :issue: `4879` 。)HTTPConnection
およびHTTPSConnection
クラスは、 source_address パラメーターをサポートするようになりました。(host, port)
2タプルは、接続に使用される送信元アドレスを提供します。 (EldonZieglerによる寄稿; :issue: `3972` 。)ihooks
モジュールは、相対インポートをサポートするようになりました。ihooks
はインポートをカスタマイズするための古いモジュールであり、Python2.0で追加されたimputil
モジュールに取って代わられていることに注意してください。 (Neil Schemenauerによって追加された相対インポートサポート。)imaplib モジュールがIPv6アドレスをサポートするようになりました。 (DerekMorrによる寄稿; :issue: `1655` 。)
新しい関数: inspect モジュールの getcallargs()は、呼び出し可能オブジェクトとその位置引数およびキーワード引数を受け取り、呼び出し可能パラメーターのどれが各引数を受け取るかを判断し、辞書マッピング引数名を返しますそれらの値に。 例えば:
>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass >>> getcallargs(f, 1, 2, 3) {'a': 1, 'b': 2, 'pos': (3,), 'named': {}} >>> getcallargs(f, a=2, x=4) {'a': 2, 'b': 1, 'pos': (), 'named': {'x': 4}} >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() takes at least 1 argument (0 given)
GeorgeSakkisによる寄稿。 :issue: `3135` 。
更新されたモジュール: io ライブラリは、Python3.1に付属のバージョンにアップグレードされました。 3.1の場合、I / Oライブラリは完全にCで書き直され、実行されているタスクに応じて2〜20倍高速になります。 元のPythonバージョンは
_pyio
モジュールに名前が変更されました。結果として生じる小さな変更の1つ: io.TextIOBase クラスに
errors
属性が追加され、エラーのエンコードとデコードに使用されるエラー設定が提供されるようになりました('strict'
、 [ X178X]、'ignore'
)。io.FileIO クラスは、無効なファイル記述子が渡されたときに OSError を発生させるようになりました。 (BenjaminPetersonによって実装されました; :issue: `4991` 。) truncate()メソッドはファイル位置を保持するようになりました。 以前は、ファイルの位置を新しいファイルの末尾に変更していました。 (PascalChambonによって修正されました; :issue: `6939` 。)
新機能:
itertools.compress(data, selectors)
は2つのイテレーターを取ります。 セレクターの対応する値がtrueの場合、データの要素が返されます。itertools.compress('ABCDEF', [1,0,1,0,1,1]) => A, C, E, F
新しい関数:
itertools.combinations_with_replacement(iter, r)
は、反復可能な iter から要素の可能なすべての r 長さの組み合わせを返します。 combinations()とは異なり、生成された組み合わせで個々の要素を繰り返すことができます。itertools.combinations_with_replacement('abc', 2) => ('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')
要素は、実際の値ではなく、入力内の位置に応じて一意として扱われることに注意してください。
itertools.count()関数に step 引数が追加され、1以外の値でインクリメントできるようになりました。 count()でもキーワード引数を使用できるようになり、floatや Decimal インスタンスなどの非整数値を使用できるようになりました。 (RaymondHettingerによって実装されました; :issue: `5032` 。)
itertools.combinations()および itertools.product()は、以前に r の値が入力反復可能値よりも大きい場合に ValueError を発生させていました。 これは仕様エラーと見なされたため、空のイテレータを返すようになりました。 (RaymondHettingerによって修正されました; :issue: `4816` 。)
更新されたモジュール: json モジュールはsimplejsonパッケージのバージョン2.0.9にアップグレードされました。これには、エンコードとデコードを高速化するC拡張機能が含まれています。 (BobIppolitoによる寄稿; :issue: `4136` 。)
新しい collections.OrderedDict タイプをサポートするために、 json.load()にオプションの object_pairs_hook パラメーターが追加されました。このパラメーターは、にデコードされるオブジェクトリテラルで呼び出されます。ペアのリスト。 (RaymondHettingerによる寄稿; :issue: `5381` 。)
mailbox モジュールの Maildir クラスは、読み取ったディレクトリにタイムスタンプを記録し、変更時刻が後で変更された場合にのみそれらを再読み取りするようになりました。 これにより、不要なディレクトリスキャンが回避され、パフォーマンスが向上します。 (AMにより修正 KuchlingとAntoinePitrou; :issue: `1607951` 、:issue:` 6896` 。)
新しい関数: math モジュールはエラー関数と補完エラー関数 expm1()で erf()と erfc()を取得しました]は、 exp()を使用して、ガンマ関数に gamma()を減算し、 lgamma()を減算するよりも、より正確に
e**x - 1
を計算します。 ]ガンマ関数の自然ログ。 (MarkDickinsonとnirinAraseliarisonによる寄稿; :issue: `3366` 。)マルチプロセッシングモジュールの
Manager*
クラスは、サブプロセスが開始されるたびに呼び出される呼び出し可能オブジェクトと、呼び出し可能オブジェクトに渡される一連の引数を渡すことができるようになりました。 (lekmaによる寄稿; :issue: `5585` 。)ワーカープロセスのプールを制御する
Pool
クラスに、オプションの maxtasksperchild パラメーターが追加されました。 ワーカープロセスは指定された数のタスクを実行してから終了し、Pool
が新しいワーカーを開始します。 これは、タスクがメモリやその他のリソースをリークする可能性がある場合、または一部のタスクによってワーカーが非常に大きくなる場合に役立ちます。 (CharlesCazabonによる寄稿; :issue: `6963` 。)nntplib モジュールがIPv6アドレスをサポートするようになりました。 (DerekMorrによる寄稿; :issue: `1664` 。)
新機能: os モジュールは、次のPOSIXシステムコールをラップします: getresgid()および getresuid()。これらは、実際の有効な保存済みGIDとUID; setresgid()および setresuid()は、実際の有効な保存済みGIDおよびUIDを新しい値に設定します。 initgroups()。現在のプロセスのグループアクセスリストを初期化します。 (TravisH。によって提供されたGID / UID関数; :issue: `6508` 。 Jean-PaulCalderoneによって追加されたinitgroupsのサポート。 :issue: `7333` 。)
os.fork()関数は、子プロセスでインポートロックを再初期化するようになりました。 これにより、 fork()がスレッドから呼び出されたときのSolarisの問題が修正されます。 (ZsoltCsernaによって修正されました; :issue: `7242` 。)
os.path モジュールで、 normpath()および abspath()関数がUnicodeを保持するようになりました。 入力パスがUnicode文字列の場合、戻り値もUnicode文字列です。 ( normpath()は:issue: `5827` でMattGiucaによって修正されました; abspath()は:issue:` 3426でEzioMelottiによって修正されました`。)
pydoc モジュールは、Pythonが使用するさまざまなシンボルのヘルプを提供するようになりました。 たとえば、
help('<<')
またはhelp('@')
を実行できるようになりました。 (DavidLabanによる寄稿; :issue: `4739` 。)re モジュールの split()、 sub()、および subn()は、オプションのフラグを受け入れるようになりました。モジュール内の他の関数との一貫性のための引数。 (GregoryPによって追加されました。 スミス。)
新しい関数: runpy モジュールの run_path()は、指定された path 引数でコードを実行します。 path は、Pythonソースファイル(
example.py
)、コンパイルされたバイトコードファイル(example.pyc
)、ディレクトリ(./package/
)、またはzipアーカイブ(example.zip
)。 ディレクトリまたはzipパスが指定されている場合は、sys.path
の前に追加され、モジュール __ main __ がインポートされます。 ディレクトリまたはzipには__main__.py
が含まれている必要があります。 そうでない場合は、他の__main__.py
がsys.path
の後半の場所からインポートされる可能性があります。 これにより、Pythonのコマンドラインが明示的なパス名を処理する方法を模倣したいスクリプトで runpy の機構をより多く利用できるようになります。 (NickCoghlanによって追加されました; :issue: `6816` 。)新機能: shutil モジュールで、 make_archive()はファイル名、アーカイブタイプ(zipまたはtar形式)、およびディレクトリパスを取得し、ディレクトリの内容を含むアーカイブを作成します。 (TarekZiadéによって追加されました。)
shutil の copyfile()および copytree()関数は、名前付きパイプのコピーを要求されたときに
SpecialFileError
例外を発生させるようになりました。 以前は、コードは名前付きパイプを読み取り用に開くことで通常のファイルのように扱い、これは無期限にブロックしていました。 (AntoinePitrouによって修正されました; :issue: `3002` 。)signal モジュールは、本当に必要な場合を除いて、シグナルハンドラーを再インストールしなくなりました。これにより、EINTRシグナルを確実にキャッチできなくなる可能性のあるバグが修正されます。 (Charles-FrancoisNataliによる修正; :issue: `8354` 。)
新しい関数: site モジュールでは、3つの新しい関数がさまざまなサイト固有およびユーザー固有のパスを返します。 getsitepackages()は、すべてのグローバルサイトパッケージディレクトリを含むリストを返し、 getusersitepackages()は、ユーザーのサイトパッケージディレクトリのパスを返し、 getuserbase()
USER_BASE
環境変数の値を返し、データの保存に使用できるディレクトリへのパスを示します。 (TarekZiadéによる寄稿; :issue: `6693` 。)site モジュールは、
sitecustomize
モジュールのインポート時に発生する例外を報告するようになり、 KeyboardInterrupt 例外をキャッチして飲み込むことがなくなりました。 (VictorStinnerによって修正されました; :issue: `3137` 。)create_connection()関数は、 source_address パラメーターを取得しました。
(host, port)
2タプルは、接続に使用される送信元アドレスを提供します。 (EldonZieglerによる寄稿; :issue: `3972` 。)recv_into()および recvfrom_into()メソッドは、バッファーAPIをサポートするオブジェクト、最も便利なのは bytearray および memoryview に書き込むようになりました。オブジェクト。 (AntoinePitrouによって実装されました; :issue: `8104` 。)
SocketServer
モジュールのTCPServer
クラスは、ソケットタイムアウトをサポートし、Nagleアルゴリズムを無効にするようになりました。disable_nagle_algorithm
クラス属性のデフォルトはFalse
です。 trueにオーバーライドされた場合、新しい要求接続にはTCP_NODELAYオプションが設定され、多数の小さな送信が単一のTCPパケットにバッファリングされないようにします。timeout
クラス属性は、要求ソケットに適用されるタイムアウトを秒単位で保持できます。 その時間内にリクエストが受信されない場合、handle_timeout()
が呼び出され、handle_request()
が返されます。 (KristjánValurJónssonによる寄稿; :issue: `6192` および:issue:` 6267` 。)更新されたモジュール: sqlite3 モジュールが pysqliteパッケージのバージョン2.6.0に更新されました。 バージョン2.6.0には多くのバグ修正が含まれており、共有ライブラリからSQLite拡張機能をロードする機能が追加されています。
enable_load_extension(True)
メソッドを呼び出して拡張機能を有効にしてから、 load_extension()を呼び出して特定の共有ライブラリをロードします。 (GerhardHäringによって更新されました。)ssl モジュールの SSLSocket オブジェクトがバッファAPIをサポートするようになりました。これにより、テストスイートの障害が修正され(AntoinePitrouによる修正; :issue: `7133` )、自動的に修正されました。 OpenSSLの
SSL_MODE_AUTO_RETRY
を設定します。これにより、SSL再ネゴシエーションをトリガーするrecv()
操作からエラーコードが返されるのを防ぎます(AntoinePitrouによる修正; :issue: `8222` )。ssl.wrap_socket()コンストラクター関数は、許可される暗号化アルゴリズムをリストする文字列である ciphers 引数を受け取るようになりました。 文字列の形式は、OpenSSLドキュメントでに説明されています。 (AntoinePitrouによって追加されました; :issue: `8322` 。)
別の変更により、拡張機能はOpenSSLのすべての暗号とダイジェストアルゴリズムをロードして、すべて使用できるようにします。 一部のSSL証明書を検証できず、「不明なアルゴリズム」エラーが報告されました。 (Beda Kosataによって報告され、AntoinePitrouによって修正されました; :issue: `8484` 。)
使用されているOpenSSLのバージョンは、モジュール属性 ssl.OPENSSL_VERSION (文字列)、 ssl.OPENSSL_VERSION_INFO (5タプル)、および ssl.OPENSSL_VERSION_NUMBERとして使用できるようになりました。 (整数)。 (AntoinePitrouによって追加されました; :issue: `8321` 。)
struct モジュールは、値が特定の整数形式コード(
bBhHiIlLqQ
のいずれか)に対して大きすぎる場合に、オーバーフローエラーをサイレントに無視しなくなりました。 常に struct.error 例外が発生するようになりました。 (MarkDickinsonによって変更されました; :issue: `1523` 。) pack()関数は、__index__()
を使用して、以前に非整数を変換およびパックしようとします。__int__()
メソッドを試すか、エラーを報告します。 (MarkDickinsonによって変更されました; :issue: `8300` 。)新機能:サブプロセスモジュールの check_output()は、指定された引数のセットを使用してコマンドを実行し、コマンドがエラーなしで実行されると、コマンドの出力を文字列として返すか、[X214Xそれ以外の場合は、CalledProcessError 例外。
>>> subprocess.check_output(['df', '-h', '.']) 'Filesystem Size Used Avail Capacity Mounted on\n /dev/disk0s2 52G 49G 3.0G 94% /\n' >>> subprocess.check_output(['df', '-h', '/bogus']) ... subprocess.CalledProcessError: Command '['df', '-h', '/bogus']' returned non-zero exit status 1
(GregoryPによる寄稿。 スミス。)
サブプロセスモジュールは、
EINTR
信号を受信すると、内部システムコールを再試行します。 (数人の報告、GregoryPによる最終パッチ。 のSmith:issue: `1068268` 。)新しい関数: symtable モジュールの is_declared_global()は、グローバルであると明示的に宣言されている変数の場合はtrueを返し、暗黙的にグローバルである変数の場合はfalseを返します。 (Jeremy Hyltonによる寄稿。)
syslog モジュールは、以前のデフォルト値である
'python'
の代わりに、sys.argv[0]
の値を識別子として使用するようになりました。 (SeanReifschneiderによって変更されました; :issue: `8451` 。)sys.version_info
値は、major
、minor
、micro
、releaselevel
、および [という名前の属性を持つ名前付きタプルになりました。 X116X]。 (RossLightによる寄稿; :issue: `4285` 。)sys.getwindowsversion()は、
major
、minor
、build
、 platform 、[ X135X] 、service_pack_major
、service_pack_minor
、suite_mask
、およびproduct_type
。 (BrianCurtinによる寄稿; :issue: `7766` 。)tarfile モジュールのデフォルトのエラー処理が変更され、致命的なエラーが抑制されなくなりました。 デフォルトのエラーレベルは以前は0でした。つまり、エラーによってデバッグログにメッセージが書き込まれるだけでしたが、デバッグログはデフォルトでアクティブ化されていないため、これらのエラーは認識されません。 デフォルトのエラーレベルは1になり、エラーが発生した場合に例外が発生します。 (LarsGustäbelによって変更されました; :issue: `7357` 。)
tarfile は、tarファイルに追加される TarInfo オブジェクトのフィルタリングをサポートするようになりました。 add()を呼び出すときは、呼び出し可能なオプションの filter 引数を指定できます。 filter 呼び出し可能オブジェクトは、追加されるすべてのファイルに対して TarInfo が渡され、変更して返すことができます。 呼び出し可能オブジェクトが
None
を返す場合、ファイルは結果のアーカイブから除外されます。 これは、既存の exclude 引数よりも強力であるため、非推奨になりました。 (LarsGustäbelによって追加されました; :issue: `6856` 。) TarFile クラスもコンテキスト管理プロトコルをサポートするようになりました。 (LarsGustäbelによって追加されました; :issue: `7232` 。)threading.Event クラスの wait()メソッドは、終了時に内部フラグを返すようになりました。 これは、 wait()は内部フラグがtrueになるまでブロックすることになっているため、メソッドは通常trueを返すことを意味します。 タイムアウトが提供され、操作がタイムアウトした場合にのみ、戻り値はfalseになります。 (TimLesherによる寄稿; :issue: `1674032` 。)
unicodedata モジュールによって提供されるUnicodeデータベースは、どの文字が数字、空白、または改行を表すかを決定するために内部的に使用されるようになりました。 データベースには、
Unihan.txt
データファイル(AndersChrigströmとAmaury Forgeotd'Arcによるパッチ; :issue: `1571184` )の情報も含まれており、バージョン5.2.0(X142X]に更新されています。 FlorentXiclunaによって更新されました; :issue: `8024` )。urlparse
モジュールのurlsplit()
は、 RFC 3986 に準拠した方法で不明なURLスキームを処理するようになりました:URLが [の形式の場合X151X]、://
の前のテキストは、モジュールが認識していない構成されたスキームであっても、スキームとして扱われます。 この変更により、古い動作を回避していたコードが破損する可能性があります。 たとえば、Python2.6.4または2.5は次を返します。>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7(およびPython 2.6.5)は以下を返します:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7は、標準のタプルではなく名前付きタプルを返すため、実際にはわずかに異なる出力を生成します。)
urlparse
モジュールは、 RFC 2732 (SenthilKumaranによる寄稿; :issue: `2987` )で定義されているIPv6リテラルアドレスもサポートしています。>>> urlparse.urlparse('http://[1080::8:800:200C:417A]/foo') ParseResult(scheme='http', netloc='[1080::8:800:200C:417A]', path='/foo', params='', query='', fragment='')
新しいクラス: weakref モジュールの WeakSet クラスは、その要素への弱い参照のみを保持するセットです。 要素を指す参照がなくなると、要素は削除されます。 (元々はRaymondHettingerによってPython3.xで実装され、Michael Foordによって2.7にバックポートされました。)
ElementTreeライブラリ
xml.etree
は、XML処理命令(<?xml-stylesheet href="#style1"?>
のように見える)またはコメント(<!-- comment -->
のように見える)を出力するときにアンパサンドと山括弧をエスケープしなくなりました。 (NeilMullerによるパッチ; :issue: `2746` 。)xmlrpclib
およびSimpleXMLRPCServer
モジュールによって提供されるXML-RPCクライアントおよびサーバーは、HTTP / 1.1キープアライブをサポートし、オプションでgzipエンコーディングを使用して交換されるXMLを圧縮することにより、パフォーマンスを向上させました。 gzip圧縮は、SimpleXMLRPCRequestHandler
のencode_threshold
属性によって制御されます。この属性には、バイト単位のサイズが含まれています。 これより大きい応答は圧縮されます。 (KristjánValurJónssonによる寄稿; :issue: `6267` 。)zipfile モジュールの ZipFile がコンテキスト管理プロトコルをサポートするようになったため、
with zipfile.ZipFile(...) as f:
と記述できます。 (BrianCurtinによる寄稿; :issue: `5511` 。)zipfile は、空のディレクトリのアーカイブもサポートし、それらを正しく抽出するようになりました。 (KubaWieczorekによる修正; :issue: `4710` 。)アーカイブからのファイルの読み取りが高速になり、 read()と
readline()
のインターリーブが正しく機能するようになりました。 (NirAidesによる寄稿; :issue: `7610` 。)is_zipfile()関数は、以前のバージョンで受け入れられていたパス名に加えて、ファイルオブジェクトを受け入れるようになりました。 (GabrielGenellinaによる寄稿; :issue: `4756` 。)
writestr()メソッドにオプションの compress_type パラメーターが追加され、 ZipFile コンストラクターで指定されたデフォルトの圧縮メソッドをオーバーライドできるようになりました。 (RonaldOussorenによる寄稿; :issue: `6003` 。)
新しいモジュール:importlib
Python 3.1には、Pythonの import ステートメントの基礎となるロジックの再実装である importlib パッケージが含まれています。 importlib は、Pythonインタープリターの実装者や、インポートプロセスに参加できる新しいインポーターを作成したいユーザーに役立ちます。 Python 2.7には、完全な importlib パッケージは含まれていませんが、代わりに、単一の関数 import_module()を含む小さなサブセットが含まれています。
import_module(name, package=None)
はモジュールをインポートします。 name は、モジュールまたはパッケージの名前を含む文字列です。 ..utils.errors
など、.
文字で始まる文字列を指定することにより、相対インポートを実行できます。 相対インポートの場合、 package 引数を指定する必要があります。これは、相対インポートのアンカーとして使用されるパッケージの名前です。 import_module()は、インポートされたモジュールをsys.modules
に挿入し、モジュールオブジェクトを返します。
ここではいくつかの例を示します。
>>> from importlib import import_module
>>> anydbm = import_module('anydbm') # Standard absolute import
>>> anydbm
<module 'anydbm' from '/p/python/Lib/anydbm.py'>
>>> # Relative import
>>> file_util = import_module('..file_util', 'distutils.command')
>>> file_util
<module 'distutils.file_util' from '/python/Lib/distutils/file_util.pyc'>
importlib は、Brett Cannonによって実装され、Python3.1で導入されました。
新しいモジュール:sysconfig
sysconfig モジュールはDistutilsパッケージから削除され、それ自体が新しいトップレベルモジュールになりました。 sysconfig は、Pythonのビルドプロセスに関する情報(コンパイラスイッチ、インストールパス、プラットフォーム名、Pythonがソースディレクトリから実行されているかどうか)を取得するための関数を提供します。
モジュールの機能の一部は次のとおりです。
- get_config_var()は、PythonのMakefileと
pyconfig.h
ファイルから変数を返します。 - get_config_vars()は、すべての構成変数を含む辞書を返します。
- get_path()は、特定のタイプのモジュール(標準ライブラリ、サイト固有のモジュール、プラットフォーム固有のモジュールなど)に構成されたパスを返します。
- is_python_build()は、Pythonソースツリーからバイナリを実行している場合はtrueを返し、それ以外の場合はfalseを返します。
詳細および機能の完全なリストについては、 sysconfig のドキュメントを参照してください。
Distutilsパッケージと sysconfig は、開発用にDistutils2パッケージ( https://hg.python.org/distutils2/ のソースリポジトリ)も開始したTarekZiadéによって管理されています。 Distutilsの次世代バージョン。
ttk:Tkのテーマウィジェット
Tcl / Tk 8.5には、基本的なTkウィジェットを再実装するテーマウィジェットのセットが含まれていますが、外観はよりカスタマイズ可能であるため、ネイティブプラットフォームのウィジェットにより近くなります。 このウィジェットセットは元々Tileと呼ばれていましたが、Tcl / Tckリリース8.5に追加されると、Ttk(「テーマTk」の略)に名前が変更されました。
詳細については、ttk
モジュールのドキュメントをお読みください。 https://www.tcl.tk/man/tcl8.5/TkCmd/ttk_intro.htmで入手可能なTtkテーマエンジンについて説明しているTcl / Tkマニュアルページも読むことをお勧めします。 使用中のPython / Ttkコードのスクリーンショットは、 https://code.google.com/archive/p/python-ttk/wikis/Screenshots.wikiにあります。
ttk
モジュールはGuilhermePoloによって作成され、:issue: `2983` に追加されました。 マーティン・フランクリンによって書かれ、ケビン・ワルザーによって維持されているTile.py
と呼ばれる代替バージョンが、:issue: `2618` に含めるよう提案されましたが、著者はGuilhermePoloの作業がより包括的であると主張しました。 。
更新されたモジュール:unittest
unittest モジュールが大幅に強化されました。 多くの新機能が追加されました。 これらの機能のほとんどは、特に明記されていない限り、MichaelFoordによって実装されました。 モジュールの拡張バージョンは、Pythonバージョン2.4から2.6で使用するために、 https://pypi.org/project/unittest2からunittest2
パッケージとしてパッケージ化されて個別にダウンロードできます。
コマンドラインから使用すると、モジュールは自動的にテストを検出できます。 py.test や nose ほど派手ではありませんが、パッケージディレクトリのセット内に保持されているテストを実行する簡単な方法を提供します。 たとえば、次のコマンドは、test/
サブディレクトリで、test*.py
という名前のインポート可能なテストファイルを検索します。
python -m unittest discover -s test
詳細については、 unittest モジュールのドキュメントを参照してください。 (:issue: `6001` で開発されました。)
main()関数は、他のいくつかの新しいオプションをサポートしています。
-b または
--buffer
は、各テスト中に標準出力と標準エラーストリームをバッファリングします。 テストに合格すると、結果の出力はすべて破棄されます。 失敗すると、バッファリングされた出力が表示されます。-c または
--catch
を使用すると、control-C割り込みがより適切に処理されます。 テストプロセスをすぐに中断する代わりに、現在実行中のテストが完了し、中断するまでの部分的な結果が報告されます。 せっかちな場合は、control-Cを2回押すと、すぐに中断します。このcontrol-Cハンドラーは、シグナルハンドラーが既に設定されていることに気づき、それを呼び出すことにより、テスト中のコードまたは実行中のテストが独自のシグナルハンドラーを定義したときに問題が発生しないようにします。 これがうまくいかない場合は、control-C処理を無効にする必要があるテストをマークするために使用できる removeHandler()デコレータがあります。
-f または
--failfast
は、テストが失敗するとすぐにテストの実行を停止し、それ以上のテストを実行し続けるのではありません。 (Cliff Dyerによって提案され、MichaelFoordによって実装されました; :issue: `8074` 。)
進行状況メッセージには、詳細モードで実行したときに、予想される失敗の場合は「x」、予期しない成功の場合は「u」が表示されるようになりました。 (Benjamin Petersonによる寄稿。)
テストケースは、 SkipTest 例外を発生させて、テストをスキップすることができます(:issue: `1034053` )。
assertEqual()、 assertTrue()、および assertFalse()エラーのエラーメッセージに、より多くの情報が表示されるようになりました。 TestCase クラスの longMessage 属性をtrueに設定すると、標準エラーメッセージと指定した追加メッセージの両方が失敗に対して出力されます。 (MichaelFoordによって追加されました; :issue: `5663` 。)
assertRaises()メソッドは、実行する呼び出し可能なオブジェクトを提供せずに呼び出されたときにコンテキストハンドラーを返すようになりました。 たとえば、次のように書くことができます。
with self.assertRaises(KeyError):
{}['foo']
(AntoinePitrouによって実装されました; :issue: `4444` 。)
モジュールレベルおよびクラスレベルのセットアップおよびティアダウンフィクスチャがサポートされるようになりました。 モジュールには、setUpModule()
およびtearDownModule()
関数を含めることができます。 クラスには、 setUpClass()および tearDownClass()メソッドを含めることができます。これらのメソッドは、クラスメソッドとして定義する必要があります(@classmethod
または同等のものを使用)。 これらの関数とメソッドは、テストランナーが別のモジュールまたはクラスのテストケースに切り替わるときに呼び出されます。
メソッド addCleanup()および doCleanups()が追加されました。 addCleanup()を使用すると、無条件に呼び出されるクリーンアップ関数を追加できます( setUp()が失敗した場合は setUp()の後、それ以外の場合は tearDown()の後)。 これにより、テスト中のリソースの割り当てと割り当て解除がはるかに簡単になります(:issue: `5679` )。
より専門的なテストを提供する多くの新しいメソッドが追加されました。 これらのメソッドの多くは、テストスイートで使用するためにGoogleのエンジニアによって作成されました。 グレゴリーP。 Smith、Michael Foord、およびGvRは、それらをPythonバージョンの unittest にマージする作業を行いました。
- assertIsNone()と assertIsNotNone()は、1つの式を取り、結果が
None
であるかどうかを確認します。 - assertIs()と assertIsNot()は2つの値を取り、2つの値が同じオブジェクトに評価されるかどうかを確認します。 (MichaelFoordによって追加されました; :issue: `2578` 。)
- assertIsInstance()および assertNotIsInstance()は、結果のオブジェクトが特定のクラスのインスタンスであるか、クラスのタプルの1つのインスタンスであるかを確認します。 (GeorgBrandlによって追加されました; :issue: `7031` 。)
- assertGreater()、 assertGreaterEqual()、 assertLess()、および assertLessEqual()は2つの量を比較します。
- assertMultiLineEqual()は、2つの文字列を比較し、それらが等しくない場合は、2つの文字列の違いを強調する有用な比較を表示します。 この比較は、Unicode文字列が assertEqual()と比較されるときにデフォルトで使用されるようになりました。
assertRegexpMatches()
およびassertNotRegexpMatches()
は、最初の引数が2番目の引数(:issue: `8038` )として提供される正規表現と一致する文字列であるかどうかを確認します。assertRaisesRegexp()
は、特定の例外が発生したかどうかをチェックし、次に、例外の文字列表現が指定された正規表現と一致することもチェックします。- assertIn()および assertNotIn()は、 first が second にあるかどうかをテストします。
assertItemsEqual()
は、提供された2つのシーケンスに同じ要素が含まれているかどうかをテストします。- assertSetEqual()は、2つのセットが等しいかどうかを比較し、エラーが発生した場合にのみセット間の違いを報告します。
- 同様に、 assertListEqual()と assertTupleEqual()は、指定されたタイプを比較し、必ずしも完全な値を出力せずに違いを説明します。 これらのメソッドは、 assertEqual()を使用してリストとタプルを比較するときにデフォルトで使用されるようになりました。 より一般的には、 assertSequenceEqual()は2つのシーケンスを比較し、オプションで両方のシーケンスが特定のタイプであるかどうかを確認できます。
- assertDictEqual()は、2つの辞書を比較し、違いを報告します。 assertEqual()を使用して2つの辞書を比較するときに、デフォルトで使用されるようになりました。
assertDictContainsSubset()
は、 first のすべてのキー/値ペアが second にあるかどうかを確認します。 - assertAlmostEqual()と assertNotAlmostEqual()は、 first と second がほぼ等しいかどうかをテストします。 この方法では、差をオプションで指定された数の place (デフォルトは7)に丸めてゼロと比較するか、差を指定された delta よりも小さくする必要があります。価値。
- loadTestsFromName()は、 TestLoader の suiteClass 属性を適切に尊重します。 (MarkRoddyによって修正されました; :issue: `6866` 。)
- 新しいフックを使用すると、 assertEqual()メソッドを拡張して新しいデータ型を処理できます。 addTypeEqualityFunc()メソッドは、型オブジェクトと関数を受け取ります。 この関数は、比較される両方のオブジェクトが指定されたタイプである場合に使用されます。 この関数は、2つのオブジェクトを比較し、それらが一致しない場合は例外を発生させる必要があります。 新しいシーケンス比較メソッドと同様に、2つのオブジェクトが一致しない理由に関する追加情報を関数が提供することをお勧めします。
unittest.main()は、オプションのexit
引数を取るようになりました。 falseの場合、 main()は sys.exit()を呼び出さないため、インタラクティブインタープリターから main()を使用できます。 (Jによる寄稿。 PabloFernández; :issue: `3379` 。)
TestResult には、テスト実行の直前と直後に呼び出される新しい startTestRun()および stopTestRun()メソッドがあります。 (RobertCollinsによる寄稿; :issue: `5728` 。)
これらすべての変更により、unittest.py
が不自然に大きくなったため、モジュールはパッケージになり、コードはいくつかのファイルに分割されました(Benjamin Petersonによる)。 これは、モジュールのインポート方法や使用方法には影響しません。
も参照してください
- http://www.voidspace.org.uk/python/articles/unittest2.shtml
- 新機能、それらの使用方法、およびさまざまな設計上の決定の根拠について説明します。 (マイケル・フォードによる。)
更新されたモジュール:ElementTree 1.3
Pythonに含まれているElementTreeライブラリのバージョンがバージョン1.3に更新されました。 新機能のいくつかは次のとおりです。
さまざまな解析関数が parser キーワード引数を取り、使用される XMLParser インスタンスを提供するようになりました。 これにより、ファイルの内部エンコーディングを上書きできます。
p = ET.XMLParser(encoding='utf-8') t = ET.XML("""<root/>""", parser=p)
XMLの解析中にエラーが発生すると、
ParseError
例外が発生します。この例外のインスタンスには、( line 、 column )タプルを含むposition
属性があります。問題。ツリーを文字列に変換するためのElementTreeのコードが大幅に作り直され、多くの場合、約2倍の速度になりました。 ElementTree.write()および
Element.write()
メソッドに、「xml」(デフォルト)、「html」、または「text」の method パラメーターが追加されました。 。 HTMLモードでは、空の要素が<empty/>
ではなく<empty></empty>
として出力され、テキストモードでは要素がスキップされ、テキストチャンクのみが出力されます。 要素のtag
属性をNone
に設定し、その子をそのままにしておくと、ツリーが書き出されるときに要素が省略されるため、これ以上の作業を行う必要はありません。単一の要素を削除するための再配置。名前空間の処理も改善されました。 すべての
xmlns:<whatever>
宣言は、結果のXML全体に分散されるのではなく、ルート要素に出力されるようになりました。default_namespace
属性を設定することでツリーのデフォルトの名前空間を設定でき、 register_namespace()で新しいプレフィックスを登録できます。 XMLモードでは、true / false xml_declaration パラメーターを使用して、XML宣言を抑制することができます。新しい Element メソッド: extends()は、シーケンスの項目を要素の子に追加します。 要素自体はシーケンスのように動作するため、子をある要素から別の要素に簡単に移動できます。
from xml.etree import ElementTree as ET t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") new = ET.XML('<root/>') new.extend(t) # Outputs <root><item>1</item>...</root> print ET.tostring(new)
新しい
Element
メソッド: iter()は、要素の子をジェネレーターとして生成します。for child in elem:
を記述して、要素の子をループすることもできます。 子のリストを作成して返すgetchildren()
と同様に、既存のメソッドgetiterator()
は非推奨になりました。新しい
Element
メソッド: itertext()は、要素の子孫であるテキストのすべてのチャンクを生成します。 例えば:t = ET.XML("""<list> <item>1</item> <item>2</item> <item>3</item> </list>""") # Outputs ['\n ', '1', ' ', '2', ' ', '3', '\n'] print list(t.itertext())
非推奨:要素をブール値として使用すると(つまり、
if elem:
)、要素に子がある場合はtrueを返し、子がない場合はfalseを返します。 この動作は紛らわしいです–None
は誤りですが、子供がいない要素も誤りですか? –これで、 FutureWarning がトリガーされます。 コードでは、明示的にする必要があります。子の数に関心がある場合はlen(elem) != 0
と記述し、elem is not None
と記述します。
Fredrik LundhはElementTreeを開発し、1.3バージョンを作成しました。 1.3について説明している彼の記事は http://effbot.org/zone/elementtree-13-intro.htm で読むことができます。 Florent Xiclunaは、python-devと:issue: `6472` での議論の後、Pythonに含まれているバージョンを更新しました。)
ビルドとCAPIの変更
PythonのビルドプロセスとCAPIへの変更は次のとおりです。
GNUデバッガーの最新リリースであるGDB7は、Python を使用してスクリプト化できます。 実行可能プログラムPのデバッグを開始すると、GDBは
P-gdb.py
という名前のファイルを探し、それを自動的に読み取ります。 Dave Malcolmは、Python自体をデバッグするときに役立つ多くのコマンドを追加するpython-gdb.py
を提供しました。 たとえば、py-up
とpy-down
は、1つのPythonスタックフレームを上下に移動します。これは通常、複数のCスタックフレームに対応します。py-print
はPython変数の値を出力し、py-bt
はPythonスタックトレースを出力します。 (:issue: `8032` の結果として追加されました。)Pythonで提供されている
.gdbinit
ファイルを使用する場合、デバッグ中のスレッドがGILを保持していない場合でも、2.7バージョンの「pyo」マクロが正しく機能するようになりました。 マクロは、印刷前にそれを取得するようになりました。 (VictorStinnerによる寄稿; :issue: `3632` 。)Py_AddPendingCall()はスレッドセーフになり、すべてのワーカースレッドがメインのPythonスレッドに通知を送信できるようになりました。 これは、非同期IO操作に特に役立ちます。 (KristjánValurJónssonによる寄稿; :issue: `4293` 。)
新しい関数: PyCode_NewEmpty()は空のコードオブジェクトを作成します。 ファイル名、関数名、および最初の行番号のみが必要です。 これは、より有用なトレースバックスタックを構築しようとしている拡張モジュールに役立ちます。 以前は、このような拡張機能は PyCode_New()を呼び出す必要があり、さらに多くの引数がありました。 (Jeffrey Yasskinによって追加されました。)
新しい関数: PyErr_NewExceptionWithDoc()は、既存の PyErr_NewException()と同じように、新しい例外クラスを作成しますが、新しいのdocstringを含む追加の
char *
引数を取ります例外クラス。 (Pythonバグトラッカーに「lekma」によって追加されました; :issue: `7033` 。)新しい関数: PyFrame_GetLineNumber()はフレームオブジェクトを受け取り、フレームが現在実行している行番号を返します。 以前のコードでは、現在実行中のバイトコード命令のインデックスを取得してから、そのアドレスに対応する行番号を検索する必要がありました。 (Jeffrey Yasskinによって追加されました。)
新しい関数: PyLong_AsLongAndOverflow()および PyLong_AsLongLongAndOverflow()は、Pythonの長整数をC long または long long として近似します。 数値が大きすぎて出力タイプに収まらない場合は、オーバーフローフラグが設定され、呼び出し元に返されます。 (Case VanHorsenによる寄稿; :issue: `7528` および:issue:` 7767` 。)
新しい関数:文字列から浮動小数点への変換の書き直しに由来して、新しい PyOS_string_to_double()関数が追加されました。 古い
PyOS_ascii_strtod()
およびPyOS_ascii_atof()
関数は非推奨になりました。新機能: PySys_SetArgvEx()は
sys.argv
の値を設定し、オプションでsys.path
を更新して、sys.argv[0]
という名前のスクリプトを含むディレクトリを含めることができます。 updatepath パラメーターの値。この関数は、Pythonを組み込んだアプリケーションのセキュリティホールを埋めるために追加されました。 古い関数 PySys_SetArgv()は、常に
sys.path
を更新し、場合によっては現在のディレクトリを追加していました。 つまり、他の誰かが制御するディレクトリにPythonを埋め込んだアプリケーションを実行した場合、攻撃者はそのディレクトリにトロイの木馬モジュール(たとえば、os.py
という名前のファイル)を置き、アプリケーションがインポートして走る。Pythonを組み込んだC / C ++アプリケーションを維持している場合は、 PySys_SetArgv()を呼び出しているかどうかを確認し、アプリケーションで PySys_SetArgvEx()と updatepathを使用する必要があるかどうかを慎重に検討してください。 をfalseに設定します。
CVE-2008-5983 として報告されたセキュリティの問題。 :issue: `5753` で説明され、AntoinePitrouによって修正されました。
新しいマクロ:Pythonヘッダーファイルで次のマクロが定義されるようになりました:
Py_ISALNUM
、Py_ISALPHA
、Py_ISDIGIT
、Py_ISLOWER
、Py_ISSPACE
、[X124X ] 、Py_ISXDIGIT
、Py_TOLOWER
、およびPy_TOUPPER
。 これらの関数はすべて、文字を分類するためのC標準マクロに類似していますが、Pythonはロケールに依存しない方法で文字を分析する必要があるため、現在のロケール設定を無視します。 (EricSmithによって追加されました; :issue: `5793` 。)削除された機能:
PyEval_CallObject
はマクロとしてのみ使用できるようになりました。 ABIリンクの互換性を維持するために関数バージョンが維持されていましたが、それは1997年のことでした。 確かに今では削除できます。 (AntoinePitrouによって削除されました; :issue: `8276` 。)新しいフォーマットコード:
PyFormat_FromString()
、PyFormat_FromStringV()
、および PyErr_Format()関数は、Cを表示するための%lld
および%llu
フォーマットコードを受け入れるようになりました。 long long タイプ。 (MarkDickinsonによる寄稿; :issue: `7228` 。)スレッドとプロセスのフォークの間の複雑な相互作用が変更されました。 以前は、 os.fork()によって作成された子プロセスは、子が os.fork()を実行する単一のスレッドのみを実行して作成されたために失敗する可能性がありました。 他のスレッドがPythonのインポートロックなどのロックを保持している場合、フォークが実行されたときに、ロックは新しいプロセスで「保持」としてマークされたままになります。 ただし、子プロセスでは、他のスレッドがレプリケートされなかったため、ロックが解放されることはなく、子プロセスはインポートを実行できなくなります。
Python 2.7は、 os.fork()を実行する前にインポートロックを取得し、 threading モジュールを使用して作成されたロックもクリーンアップします。 内部ロックがある、または
fork()
自体を呼び出すC拡張モジュールは、このクリーンアップの恩恵を受けません。(ThomasWoutersによる修正; :issue: `1590864` 。)
Py_Finalize()関数は、内部の
threading._shutdown()
関数を呼び出すようになりました。 これにより、インタプリタがシャットダウンしたときに一部の例外が発生するのを防ぎます。 (AdamOlsenによるパッチ; :issue: `1722344` 。)PyMemberDef 構造体を使用して型の属性を定義する場合、Pythonでは
T_STRING_INPLACE
属性を削除または設定できなくなりました。ctypes モジュールで定義されたグローバルシンボルの接頭辞は、
Py
または_ctypes
になりました。 (ThomasHellerによって実装されました; :issue: `3102` 。)新しい構成オプション:
--with-system-expat
スイッチを使用すると、pyexpat
モジュールを構築してシステムExpatライブラリを使用できます。 (Arfrever Frehtes TaifersarArahesisによる寄稿; :issue: `7609` 。)新しい構成オプション:
--with-valgrind
オプションは、pymallocアロケーターを無効にするようになりました。これは、Valgrindメモリエラー検出器が正しく分析するのが困難です。 したがって、Valgrindは、メモリリークとオーバーランの検出に優れています。 (JamesHenstridgeによる寄稿; :issue: `2422` 。)新しい構成オプション:さまざまなDBMモジュールをすべて無効にするために、
--with-dbmliborder=
に空の文字列を指定できるようになりました。 (Arfrever Frehtes TaifersarArahesisによって追加されました; :issue: `6491` 。)configure スクリプトは、特定の32ビットIntelチップの浮動小数点丸めのバグをチェックし、
X87_DOUBLE_ROUNDING
プリプロセッサ定義を定義するようになりました。 現在、この定義を使用しているコードはありませんが、誰かが使用したい場合は利用できます。 (MarkDickinsonによって追加されました; :issue: `2937` 。)configure は、C ++リンクをサポートするための
LDCXXSHARED
Makefile変数も設定するようになりました。 (Arfrever Frehtes TaifersarArahesisによる寄稿; :issue: `1222585` 。)ビルドプロセスにより、pkg-configサポートに必要なファイルが作成されるようになりました。 (ClintonRoyによる寄稿; :issue: `3585` 。)
ビルドプロセスがSubversion1.7をサポートするようになりました。 (Arfrever Frehtes TaifersarArahesisによる寄稿; :issue: `6094` 。)
カプセル
Python 3.1は、拡張モジュールにC APIを提供するために、新しいCデータ型 PyCapsule を追加します。 カプセルは本質的にC void *
ポインターのホルダーであり、モジュール属性として使用可能になります。 たとえば、 socket モジュールのAPIはsocket.CAPI
として公開され、 unicodedata はucnhash_CAPI
を公開します。 他の拡張機能は、モジュールをインポートし、その辞書にアクセスしてカプセルオブジェクトを取得してから、void *
ポインターを取得できます。これは通常、モジュールのさまざまなAPI関数へのポインターの配列を指します。
これにすでに使用されている既存のデータ型PyCObject
がありますが、型の安全性は提供されていません。 純粋なPythonで記述された悪意のあるコードは、モジュールAからPyCObject
を取得し、それをモジュールBのPyCObject
に置き換えることで、セグメンテーション違反を引き起こす可能性があります。 カプセルは自分の名前を知っており、ポインターを取得するには名前を指定する必要があります。
void *vtable;
if (!PyCapsule_IsValid(capsule, "mymodule.CAPI") {
PyErr_SetString(PyExc_ValueError, "argument type invalid");
return NULL;
}
vtable = PyCapsule_GetPointer(capsule, "mymodule.CAPI");
vtable
はあなたが期待しているものを指しているので安心です。 別のカプセルが渡された場合、 PyCapsule_IsValid()は不一致の名前を検出し、falseを返します。 これらのオブジェクトの使用の詳細については、拡張モジュール用のCAPIの提供を参照してください。
Python 2.7は、カプセルを内部で使用してさまざまな拡張モジュールAPIを提供するようになりましたが、PyCObject_AsVoidPtr()
はカプセルを処理するように変更され、CObject
インターフェイスとのコンパイル時の互換性が維持されています。 PyCObject_AsVoidPtr()
を使用すると、 PendingDeprecationWarning が通知されます。これは、デフォルトではサイレントです。
Python 3.1で実装され、LarryHastingsによって2.7にバックポートされました。 :issue: `5630` で説明されています。
ポート固有の変更:Windows
- msvcrt モジュールには、
crtassem.h
ヘッダーファイルの定数CRT_ASSEMBLY_VERSION
、VC_ASSEMBLY_PUBLICKEYTOKEN
、およびLIBRARIES_ASSEMBLY_NAME_PREFIX
が含まれるようになりました。 (DavidCournapeauによる寄稿; :issue: `4365` 。) - レジストリにアクセスするための
_winreg
モジュールは、CreateKeyEx()
およびDeleteKeyEx()
関数を実装するようになりました。これは、以前にサポートされていた関数の拡張バージョンであり、いくつかの追加の引数を取ります。DisableReflectionKey()
、EnableReflectionKey()
、およびQueryReflectionKey()
もテストされ、文書化されました。 (Brian Curtinによって実装::issue: `7347` 。) - 新しい
_beginthreadex()
APIを使用してスレッドを開始し、ネイティブのスレッドローカルストレージ関数を使用するようになりました。 (KristjánValurJónssonによる寄稿; :issue: `3582` 。) - os.kill()関数がWindowsで機能するようになりました。 信号値は、定数
CTRL_C_EVENT
、CTRL_BREAK_EVENT
、または任意の整数にすることができます。 最初の2つの定数は、 Control-C および Control-Break キーストロークイベントをサブプロセスに送信します。 その他の値はTerminateProcess()
APIを使用します。 (MikiTebekaによる寄稿; :issue: `1220212` 。) - os.listdir()関数は、空のパスに対して正しく失敗するようになりました。 (山本博和による修正; :issue: `5913` 。)
mimelib
モジュールは、初期化時にWindowsレジストリからMIMEデータベースを読み取るようになりました。 (GabrielGenellinaによるパッチ; :issue: `4969` 。)
ポート固有の変更:Mac OS X
追加されたパッケージをシステムインストールとユーザーがインストールした同じバージョンのコピー間で共有するために、パス
/Library/Python/2.7/site-packages
がsys.path
に追加されました。 (RonaldOussorenによって変更されました; :issue: `4865` 。)バージョン2.7.13での変更: 2.7.13以降、この変更は削除されました。
/Library/Python/2.7/site-packages
、Apple提供のシステムPython 2.7で使用されるsite-packagesディレクトリは、python.orgインストーラーなどのユーザーインストールPythonのsys.path
に追加されなくなりました。 macOS 10.12以降、Appleはシステムのsite-packagesディレクトリの構成方法を変更しました。これにより、setuptoolsなどのpipコンポーネントのインストールが失敗する可能性がありました。 システムPython用にインストールされたパッケージは、ユーザーがインストールしたPythonと共有されなくなります。 (:issue: `28440` )
ポート固有の変更:FreeBSD
- FreeBSD7.1の
SO_SETFIB
定数は、getsockopt()
/setsockopt()
とともに使用され、代替ルーティングテーブルを選択します。 socket モジュールで使用できるようになりました。 (KyleVanderBeekによって追加されました; :issue: `8235` 。)
その他の変更と修正
iobench
とccbench
の2つのベンチマークスクリプトがTools
ディレクトリに追加されました。iobench
は、さまざまな操作の実行中に open()によって返される組み込みファイルI / Oオブジェクトの速度を測定し、ccbench
は測定を試みる同時実行ベンチマークです。さまざまな数のスレッドを使用して複数のタスクを実行する場合の、コンピューティングスループット、スレッドスイッチング遅延、およびIO処理帯域幅。Tools/i18n/msgfmt.py
スクリプトは、.po
ファイルの複数形を理解するようになりました。 (MartinvonLöwisによる修正; :issue: `5464` 。).pyc
または.pyo
ファイルから既存の.py
に対応するモジュールをインポートすると、元のファイル名のときに、結果のコードオブジェクトのco_filename
属性が上書きされます。廃止されました。 これは、ファイルの名前が変更されたり、移動されたり、別のパスからアクセスされたりした場合に発生する可能性があります。 (ZigaSeilnachtとJean-PaulCalderoneによるパッチ; :issue: `1180193` 。)regrtest.py
スクリプトは、ランダムな順序でテストを実行する-r
オプションのランダムシードとして使用される整数を受け取る--randseed=
スイッチを使用するようになりました。-r
オプションは、使用されたシードも報告します(Collin Winterによって追加されました)。- もう1つの
regrtest.py
スイッチは-j
で、これは並列に実行されるテストの数を指定する整数を取ります。 これにより、マルチコアマシンの合計実行時間を短縮できます。 このオプションは、長いランタイムを生成することが知られている-R
スイッチなど、他のいくつかのオプションと互換性があります。 (Antoine Pitrouによって追加されました。:issue: `6152` 。)これは、選択したテストを失敗するまでループで実行する新しい-F
スイッチでも使用できます。 (AntoinePitrouによって追加されました; :issue: `7312` 。) - スクリプトとして実行されると、
py_compile.py
モジュールは引数として'-'
を受け入れるようになりました。これにより、コンパイルされるファイル名のリストの標準入力が読み取られます。 (PiotrOżarowskiによる寄稿; :issue: `8233` 。)
Python2.7への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
- range()関数は、引数をより一貫して処理します。 提供された非浮動引数、非整数引数で
__int__()
を呼び出すようになりました。 (AlexanderBelopolskyによって修正されました; :issue: `1533` 。) - 文字列 format()メソッドは、浮動小数点および複素数に使用されるデフォルトの精度を小数点以下6桁から12に変更しました。これは、 str()で使用される精度と一致します。 (EricSmithによって変更されました; :issue: `5920` 。)
- with ステートメントが最適化されているため、特別なメソッド
__enter__()
および__exit__()
はオブジェクトのタイプに属している必要があり、オブジェクトのインスタンスに直接アタッチすることはできません。 これは、新しいスタイルのクラス(オブジェクトから派生)およびC拡張タイプに影響します。 (:issue: `6101` 。) - Python 2.6のバグにより、
__exit__()
メソッドの exc_value パラメーターは、インスタンスではなく、例外の文字列表現であることがよくありました。 これは2.7で修正されたため、 exc_value は期待どおりのインスタンスになります。 (FlorentXiclunaによって修正されました; :issue: `7853` 。) __slots__
を使用して制限された属性のセットが設定された場合、未設定の属性を削除しても、期待どおりに AttributeError は発生しません。 ベンジャミンピーターソンによって修正されました。 :issue: `7604` 。)
標準ライブラリ:
datetime インスタンスを使用した操作で、サポートされている範囲から1年が外れると、 OverflowError が常に発生するとは限りませんでした。 このようなエラーはより注意深くチェックされるようになり、例外が発生します。 (Mark Leanderによる報告、AnandBによるパッチ。 ピライとアレクサンダーベロポルスキー; :issue: `7150` 。)
文字列の format()メソッドで Decimal インスタンスを使用する場合、デフォルトの配置は以前は左配置でした。 これは右揃えに変更されており、プログラムの出力が変わる可能性があります。 (MarkDickinsonによって変更されました; :issue: `6857` 。)
シグナリングNaN値(または
sNAN
)を含む比較では、比較演算子に応じてtrueまたはfalseの値をサイレントに返すのではなく、 InvalidOperation をシグナリングするようになりました。 静かなNaN値(またはNaN
)がハッシュ可能になりました。 (MarkDickinsonによって修正されました; :issue: `7279` 。)ElementTreeライブラリ、
xml.etree
、XML処理命令を出力するときにアンパサンドと山かっこをエスケープしなくなりました(次のようになります) )またはコメント( )。 (NeilMullerによるパッチ; :issue: `2746` 。)StringIO
オブジェクトのreadline()
メソッドは、他のファイルのようなオブジェクトと同様に、負の長さが要求されても何も実行しないようになりました。 (:issue: `7348` )。syslog モジュールは、以前のデフォルト値である
'python'
の代わりに、sys.argv[0]
の値を識別子として使用するようになりました。 (SeanReifschneiderによって変更されました; :issue: `8451` 。)tarfile モジュールのデフォルトのエラー処理が変更され、致命的なエラーが抑制されなくなりました。 デフォルトのエラーレベルは以前は0でした。つまり、エラーによってデバッグログにメッセージが書き込まれるだけでしたが、デバッグログはデフォルトでアクティブ化されていないため、これらのエラーは認識されません。 デフォルトのエラーレベルは1になり、エラーが発生した場合に例外が発生します。 (LarsGustäbelによって変更されました; :issue: `7357` 。)
urlparse
モジュールのurlsplit()
は、 RFC 3986 に準拠した方法で不明なURLスキームを処理するようになりました:URLが [の形式の場合X151X]、://
の前のテキストは、モジュールが認識していない構成されたスキームであっても、スキームとして扱われます。 この変更により、古い動作を回避していたコードが破損する可能性があります。 たとえば、Python2.6.4または2.5は次を返します。>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', '', '//host/filename?query', '', '')
Python 2.7(およびPython 2.6.5)は以下を返します:
>>> import urlparse >>> urlparse.urlsplit('invented://host/filename?query') ('invented', 'host', '/filename?query', '', '')
(Python 2.7は、標準のタプルではなく名前付きタプルを返すため、実際にはわずかに異なる出力を生成します。)
C拡張機能の場合:
PyArg_Parse*
ファミリーの関数で整数フォーマットコードを使用するC拡張機能は、 DeprecationWarning (:issue: `5080]をトリガーする代わりに、 TypeError 例外を発生させるようになりました。 `)。- 現在非推奨となっている古い
PyOS_ascii_strtod()
およびPyOS_ascii_atof()
関数の代わりに、新しい PyOS_string_to_double()関数を使用してください。
Pythonを組み込んだアプリケーションの場合:
- PySys_SetArgvEx()関数が追加され、既存の PySys_SetArgv()関数が使用されたときにアプリケーションがセキュリティホールを閉じることができるようになりました。 PySys_SetArgv()を呼び出しているかどうかを確認し、アプリケーションで updatepath をfalseに設定して PySys_SetArgvEx()を使用する必要があるかどうかを慎重に検討してください。
Python2.7メンテナンスリリースに追加された新機能
状況が本当に必要な場合は、Python2.7メンテナンスリリースに新機能が追加される可能性があります。 このような追加は、Python拡張提案プロセスを経て、Python 3にのみ新しい機能を追加するか、Python Package Indexで公開することによって、適切に対処できない理由について説得力のある主張をする必要があります。
以下にリストされている特定の提案に加えて、Python2.7メンテナンスリリースに新しい-3
警告を追加できる一般的な免除があります。
デバッグモード用の2つの新しい環境変数
デバッグモードでは、[xxx refs]
統計はデフォルトでは書き込まれません。ここで、 PYTHONSHOWREFCOUNT
環境変数も設定する必要があります。 (VictorStinnerによる寄稿; :issue: `31733` 。)
PythonがCOUNT_ALLOC
を定義してコンパイルされると、割り当てカウントがデフォルトでダンプされなくなりました。 PYTHONSHOWALLOCCOUNT
環境変数も設定する必要があります。 さらに、割り当てカウントがstdoutではなくstderrにダンプされるようになりました。 (VictorStinnerによる寄稿; :issue: `31692` 。)
バージョン2.7.15の新機能。
PEP 434:すべてのブランチのIDLE拡張例外
PEP 434 は、Pythonとともに出荷されるIDLE開発環境に加えられた変更の一般的な免除について説明しています。 この免除により、IDLE開発者は、サポートされているすべてのバージョンのPython2および3でより一貫したユーザーエクスペリエンスを提供できます。
IDLEの変更の詳細については、特定のリリースのNEWSファイルを参照してください。
PEP 466:Python2.7のネットワークセキュリティの強化
PEP 466 は、Python 2.7メンテナンスリリースへの組み込みが承認された多数のネットワークセキュリティ拡張提案について説明しています。これらの変更の最初のものは、Python2.7.7リリースに表示されます。
PEP 466 関連機能がPython2.7.7で追加されました。
- hmac.compare_digest()はPython 3からバックポートされ、Python2アプリケーションでタイミング攻撃に強い比較操作を利用できるようになりました。 (AlexGaynorによる寄稿; :issue: `21306` 。)
- OpenSSL 1.0.1gは、python.orgで公開されている公式のWindowsインストーラーでアップグレードされました。 (ZacharyWareによる寄稿; :issue: `21462` 。)
PEP 466 関連機能がPython2.7.8で追加されました。
- hashlib.pbkdf2_hmac()はPython 3からバックポートされ、Python2アプリケーションで広く利用できる安全なパスワードストレージに適したハッシュアルゴリズムを作成しました。 (AlexGaynorによる寄稿; :issue: `21304` 。)
- OpenSSL 1.0.1hは、python.orgで公開されている公式のWindowsインストーラー用にアップグレードされました。 (CVE-2014-0224の:issue: `21671` でZacharyWareによって寄稿されました)
PEP 466 関連機能がPython2.7.9で追加されました。
Python3.4の ssl モジュールのほとんどがバックポートされました。 つまり、 ssl は、サーバー名表示、TLS1.x設定、プラットフォーム証明書ストアへのアクセス、 SSLContext クラス、およびその他の機能をサポートするようになりました。 (AlexGaynorとDavidReidによる寄稿; :issue: `21308` 。)
具体的な詳細については、モジュールのドキュメントの「追加されたバージョン:2.7.9」の注記を参照してください。
os.urandom()は、呼び出しごとに
/dev/urandom
を再度開くのではなく、ファイル記述子を/dev/urandom
にキャッシュするように変更されました。 (AlexGaynorによる寄稿; :issue: `21305` 。)hashlib.algorithms_guaranteed と hashlib.algorithms_available は、Python 3からバックポートされ、Python2アプリケーションが利用可能な最強のハッシュアルゴリズムを簡単に選択できるようになりました。 (:issue: `21307` のAlexGaynorによる寄稿)
PEP 477:Ensurepip(PEP 453)をPython2.7にバックポートする
PEP 477 は、 PEP 453 のensurepipモジュールとそれによってPython2.7メンテナンスリリースで有効になった改善されたドキュメントを含めることを承認します、Python2.7.9リリースで最初に登場しました。
デフォルトでのブートストラップピップ
新しい ensurepip モジュール( PEP 453 で定義)は、pipインストーラーをPythonインストールにブートストラップするための標準のクロスプラットフォームメカニズムを提供します。 Python2.7.9に含まれているpip
のバージョンはpip
1.5.6であり、将来の2.7.xメンテナンスリリースでは、バンドルされているバージョンがpip
の最新バージョンに更新されます。リリース候補の作成時に利用可能です。
デフォルトでは、コマンドpip
、pipX
、およびpipX.Y
は、pip
Pythonパッケージとその依存関係。
CPython ソースビルドがPOSIXシステムの場合、make install
およびmake altinstall
コマンドはデフォルトでpip
をブートストラップしません。 この動作は、configureオプションを介して制御し、Makefileオプションを介してオーバーライドできます。
WindowsおよびMacOS Xでは、CPythonインストーラーはデフォルトでpip
をCPython自体と一緒にインストールするようになりました(ユーザーはインストールプロセス中にインストールをオプトアウトできます)。 ウィンドウユーザーは、自動PATH
変更をオプトインして、デフォルトでコマンドラインからpip
を使用できるようにする必要があります。そうしないと、Windows用のPythonランチャーから [としてアクセスできます。 X218X]。
PEP で説明されているように、プラットフォームパッケージャーは、呼び出されたときに、そのプラットフォームにコマンドをインストールする方法(通常はシステムを使用)について明確で簡単な指示を提供する限り、デフォルトでこれらのコマンドをインストールしないことを選択できます。パッケージマネージャー)。
ドキュメントの変更
この変更の一環として、ドキュメントの Pythonモジュールのインストールおよび Pythonモジュールの配布セクションが、簡単な開始およびFAQドキュメントとして完全に再設計されました。 ほとんどのパッケージドキュメントは、Python PackagingAuthorityが管理する PythonPackagingユーザーガイドと個々のプロジェクトのドキュメントに移動されました。
ただし、この移行は現在まだ完了していないため、これらのガイドのレガシーバージョンは、 Pythonモジュールのインストール(レガシーバージョン)および Pythonモジュールの配布(レガシーバージョン)として引き続き利用できます。
も参照してください
- PEP 453 –Pythonインストールでのpipの明示的なブートストラップ
- DonaldStufftとNickCoghlanによって作成されたPEPは、Donald Stufft、Nick Coghlan、MartinvonLöwisおよびNedDeilyによって実装されました。
PEP 476:stdlibhttpクライアントの証明書検証をデフォルトで有効にする
PEP 476 は、httplib
と、それを使用するurllib2
やxmlrpclib
などのモジュールを更新し、サーバーが存在することを確認するようになりました。プラットフォームトラストストアの認証局によって署名され、そのホスト名がデフォルトで要求されているホスト名と一致する証明書。これにより、多くのアプリケーションのセキュリティが大幅に向上します。 この変更は、Python2.7.9リリースで行われました。
以前の古い動作を必要とするアプリケーションの場合、代替コンテキストを渡すことができます。
import urllib2
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")
urllib2.urlopen("https://invalid-cert", context=context)
PEP 493:Python2.7用のHTTPS検証移行ツール
PEP 493 は、クライアントHTTPS接続を確立するときに、サーバー証明書の歴史的に許容される処理に依存するアプリケーションとサービスを含む環境の、より段階的なインフラストラクチャアップグレードプロセスをサポートする追加の移行ツールを提供します。 これらの追加は、Python2.7.12リリースで行われました。
これらのツールは、影響を受けるアプリケーションやサービスを変更して、接続を確立するときに、より寛容なSSLコンテキストを明示的に渡すことができない場合に使用することを目的としています。
まったく変更できないアプリケーションとサービスの場合、新しいPYTHONHTTPSVERIFY
環境変数を0
に設定して、Pythonプロセス全体をPython2.7.8のデフォルトの許容動作に戻すことができます。およびそれ以前。
接続確立コードを変更できないが、アプリケーション全体を変更できる場合は、新しいssl._https_verify_certificates()
関数を使用して、実行時のデフォルトの動作を調整できます。
新しいmake regen-allビルドターゲット
クロスコンパイルを簡素化し、既存のバージョンのPythonがすでに利用可能でなくても、CPythonを確実にコンパイルできるようにするために、autotoolsベースのビルドシステムは、ファイルの変更時間に基づいて生成されたファイルを暗黙的に再コンパイルしようとしなくなりました。
代わりに、新しいmake regen-all
コマンドが追加され、必要に応じてこれらのファイルを強制的に再生成します(例: Pythonの初期バージョンが、事前に生成されたバージョンに基づいてすでに構築された後)。
より選択的な再生ターゲットも定義されています。詳細については、:source: `Makefile.pre.in` を参照してください。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン2.7.14の新機能。
make touchビルドターゲットの削除
以前は、変更時刻を更新して生成されたファイルの暗黙的な再生成を要求するために使用されていたmake touch
ビルドターゲットが削除されました。
新しいmake regen-all
ターゲットに置き換えられました。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン2.7.14で変更されました。
謝辞
著者は、この記事のさまざまなドラフトについて提案、修正、および支援を提供してくれた次の人々に感謝します:Nick Coghlan、Philip Jenvey、Ryan Lovett、R。 デビッドマレー、ヒューセッカー-ウォーカー。