Python 3.2の新機能—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/whatsnew/3.2
移動先:案内検索

Python3.2の新機能

著者
レイモンドヘッティンガー

この記事では、3.1と比較したPython3.2の新機能について説明します。 いくつかのハイライトに焦点を当て、いくつかの例を示します。 詳細については、 Misc / NEWS ファイルを参照してください。

も参照してください

PEP 392 -Python3.2のリリーススケジュール


PEP 384:安定したABIの定義

以前は、あるPythonバージョン用に構築された拡張モジュールは、他のPythonバージョンでは使用できないことがよくありました。 特にWindowsでは、Pythonのすべての機能リリースで、使用したいすべての拡張モジュールを再構築する必要がありました。 この要件は、拡張モジュールが使用できるPythonインタープリター内部への無料アクセスの結果でした。

Python 3.2では、別のアプローチが利用可能になります。(Py_LIMITED_APIを定義することによって)制限されたAPIに制限する拡張モジュールは、多くの内部を使用できませんが、いくつかのリリースで安定すると約束されているAPI関数のセットに制限されます。 結果として、そのモードで3.2用に構築された拡張モジュールは、3.3、3.4などでも機能します。 メモリ構造の詳細を利用する拡張モジュールは引き続き構築できますが、機能リリースごとに再コンパイルする必要があります。

も参照してください

PEP 384 -安定したABIの定義
MartinvonLöwisによって書かれたPEP。


PEP 389:Argparseコマンドライン解析モジュール

コマンドライン解析用の新しいモジュール argparse が導入され、位置引数(オプションだけでなく)、サブコマンド、必須オプションなどのサポートを提供しなかった optparse の制限を克服しました。オプションの指定と検証の一般的なパターン。

このモジュールは、サードパーティのモジュールとしてコミュニティですでに広く成功しています。 以前のモジュールよりも完全な機能を備えた argparse モジュールは、コマンドライン処理に適したモジュールになりました。 古いモジュールは、それに依存するかなりの量のレガシーコードがあるため、引き続き利用可能です。

これは、結果を選択肢のセットに制限する、ヘルプ画面で metavar を指定する、1つ以上の位置引数が存在することを検証する、必要なオプションを作成するなどの機能を示す注釈付きのパーサーの例です。

import argparse
parser = argparse.ArgumentParser(
            description = 'Manage servers',         # main description for help
            epilog = 'Tested on Solaris and Linux') # displayed after help
parser.add_argument('action',                       # argument name
            choices = ['deploy', 'start', 'stop'],  # three allowed values
            help = 'action on each target')         # help msg
parser.add_argument('targets',
            metavar = 'HOSTNAME',                   # var name used in help msg
            nargs = '+',                            # require one or more targets
            help = 'url for target machines')       # help msg explanation
parser.add_argument('-u', '--user',                 # -u or --user option
            required = True,                        # make it a required argument
            help = 'login as user')

コマンド文字列でパーサーを呼び出す例:

>>> cmd = 'deploy sneezy.example.com sleepy.example.com -u skycaptain'
>>> result = parser.parse_args(cmd.split())
>>> result.action
'deploy'
>>> result.targets
['sneezy.example.com', 'sleepy.example.com']
>>> result.user
'skycaptain'

パーサーの自動生成されたヘルプの例:

>>> parser.parse_args('-h'.split())

usage: manage_cloud.py [-h] -u USER
                       {deploy,start,stop} HOSTNAME [HOSTNAME ...]

Manage servers

positional arguments:
  {deploy,start,stop}   action on each target
  HOSTNAME              url for target machines

optional arguments:
  -h, --help            show this help message and exit
  -u USER, --user USER  login as user

Tested on Solaris and Linux

特に優れた argparse 機能は、サブパーサーを定義する機能です。サブパーサーには、それぞれ独自の引数パターンとヘルプ表示があります。

import argparse
parser = argparse.ArgumentParser(prog='HELM')
subparsers = parser.add_subparsers()

parser_l = subparsers.add_parser('launch', help='Launch Control')   # first subgroup
parser_l.add_argument('-m', '--missiles', action='store_true')
parser_l.add_argument('-t', '--torpedos', action='store_true')

parser_m = subparsers.add_parser('move', help='Move Vessel',        # second subgroup
                                 aliases=('steer', 'turn'))         # equivalent names
parser_m.add_argument('-c', '--course', type=int, required=True)
parser_m.add_argument('-s', '--speed', type=int, default=0)
$ ./helm.py --help                         # top level help (launch and move)
$ ./helm.py launch --help                  # help for launch options
$ ./helm.py launch --missiles              # set missiles=True and torpedos=False
$ ./helm.py steer --course 180 --speed 5   # set movement parameters

も参照してください

PEP 389 -新しいコマンドライン解析モジュール
スティーブンベットハルトによって書かれたPEP。

[[Python/docs/3.8/library/argparse#upgrading-optparse-code|]] optparse との違いの詳細については、optparseコードをアップグレードしています。


PEP 391:ロギング用の辞書ベースの構成

logging モジュールは、2種類の構成を提供しました。1つは各オプションの関数呼び出しを伴うスタイル、もう1つはConfigParser形式で保存された外部ファイルによって駆動されるスタイルです。 これらのオプションは、JSONまたはYAMLファイルから構成を作成する柔軟性を提供しませんでした。また、コマンドラインからロガーオプションを指定するために必要な増分構成もサポートしていませんでした。

より柔軟なスタイルをサポートするために、モジュールは、プレーンなPython辞書でロギング構成を指定するための logging.config.dictConfig()を提供するようになりました。 構成オプションには、フォーマッター、ハンドラー、フィルター、およびロガーが含まれます。 構成ディクショナリの実際の例を次に示します。

{"version": 1,
 "formatters": {"brief": {"format": "%(levelname)-8s: %(name)-15s: %(message)s"},
                "full": {"format": "%(asctime)s %(name)-15s %(levelname)-8s %(message)s"}
                },
 "handlers": {"console": {
                   "class": "logging.StreamHandler",
                   "formatter": "brief",
                   "level": "INFO",
                   "stream": "ext://sys.stdout"},
              "console_priority": {
                   "class": "logging.StreamHandler",
                   "formatter": "full",
                   "level": "ERROR",
                   "stream": "ext://sys.stderr"}
              },
 "root": {"level": "DEBUG", "handlers": ["console", "console_priority"]}}

その辞書がconf.jsonというファイルに保存されている場合は、次のようなコードでロードして呼び出すことができます。

>>> import json, logging.config
>>> with open('conf.json') as f:
...     conf = json.load(f)
...
>>> logging.config.dictConfig(conf)
>>> logging.info("Transaction completed normally")
INFO    : root           : Transaction completed normally
>>> logging.critical("Abnormal termination")
2011-02-17 11:14:36,694 root            CRITICAL Abnormal termination

も参照してください

PEP 391 -ロギング用の辞書ベースの構成
VinaySajipによって書かれたPEP。


PEP 3148:concurrent.futuresモジュール

同時実行性を作成および管理するためのコードは、新しいトップレベルの名前空間 concurrent に収集されています。 その最初のメンバーは futures パッケージであり、スレッドとプロセスを管理するための統一された高レベルのインターフェースを提供します。

concurrent.futures のデザインは、 java.util.concurrent パッケージに触発されました。 そのモデルでは、実行中の呼び出しとその結果は、スレッド、プロセス、およびリモートプロシージャコールに共通の機能を抽象化する Future オブジェクトによって表されます。 そのオブジェクトは、ステータスチェック(実行中または完了)、タイムアウト、キャンセル、コールバックの追加、および結果または例外へのアクセスをサポートします。

新しいモジュールの主な提供物は、コールを起動および管理するためのエグゼキュータクラスのペアです。 エグゼキュータの目標は、既存のツールを使用して並列呼び出しを簡単に行えるようにすることです。 これらは、リソースのプールのセットアップ、呼び出しの起動、結果キューの作成、タイムアウト処理の追加、およびスレッド、プロセス、またはリモートプロシージャコールの総数の制限に必要な労力を節約します。

理想的には、プロセスとスレッドの制限を一元管理できるように、各アプリケーションは複数のコンポーネント間で単一のエグゼキュータを共有する必要があります。 これにより、各コンポーネントにリソース管理のための独自の競合戦略がある場合に発生する設計上の課題が解決されます。

両方のクラスは、次の3つのメソッドと共通のインターフェイスを共有します。 submit()は、呼び出し可能オブジェクトをスケジュールし、 Future オブジェクトを返します。 map()は一度に多くの非同期呼び出しをスケジュールし、 shutdown()はリソースを解放します。 このクラスはコンテキストマネージャーであり、 with ステートメントで使用して、現在保留中の先物の実行が完了したときにリソースが自動的に解放されるようにすることができます。

ThreadPoolExecutor の簡単な例は、ファイルをコピーするための4つの並列スレッドの起動です。

import concurrent.futures, shutil
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as e:
    e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
    e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
    e.submit(shutil.copy, 'src3.txt', 'dest4.txt')

も参照してください

PEP 3148 -先物–計算を非同期で実行する
ブライアンクインランによって書かれたPEP。

スレッド化された並列URL読み取りのコード、スレッドを使用して複数のWebページを並列にフェッチする例。

素数を並列に計算するためのコードProcessPoolExecutor を示す例。


PEP 3147:PYCリポジトリディレクトリ

.pyc ファイルにバイトコードをキャッシュするためのPythonのスキームは、複数のPythonインタープリターがある環境ではうまく機能しませんでした。 あるインタプリタが別のインタプリタによって作成されたキャッシュファイルに遭遇した場合、ソースを再コンパイルしてキャッシュファイルを上書きするため、キャッシュの利点が失われます。

Linuxディストリビューションが複数のバージョンのPythonとともに出荷されることが一般的になっているため、「pycfights」の問題はより顕著になっています。 これらの競合は、UnladenSwallowなどのCPythonの代替手段でも発生します。

この問題を解決するために、Pythonのインポート機構が拡張され、インタプリタごとに異なるファイル名を使用するようになりました。 Python 3.2、Python 3.3、Unladen Swallowがそれぞれ「mymodule.pyc」というファイルをめぐって競合する代わりに、「mymodule.cpython-32.pyc」、「mymodule.cpython-33.pyc」、「mymodule」を検索するようになりました。 .unladen10.pyc」。 また、これらすべての新しいファイルがソースディレクトリを乱雑にするのを防ぐために、 pyc ファイルはパッケージディレクトリの下に保存されている「__pycache__」ディレクトリに収集されるようになりました。

ファイル名とターゲットディレクトリの他に、新しいスキームにはプログラマーに見えるいくつかの側面があります。

  • インポートされたモジュールには、インポートされた実際のファイルの名前を格納する __ cached __ 属性が含まれるようになりました。

    >>> import collections
    >>> collections.__cached__ 
    'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
  • 各インタプリタに固有のタグには、 imp モジュールからアクセスできます。

    >>> import imp
    >>> imp.get_tag() 
    'cpython-32'
  • インポートされたファイルからソースファイル名を推測しようとするスクリプトは、よりスマートにする必要があります。 「.pyc」ファイル名から「c」を削除するだけではもはや十分ではありません。 代わりに、 imp モジュールの新しい関数を使用してください。

    >>> imp.source_from_cache('c:/py32/lib/__pycache__/collections.cpython-32.pyc')
    'c:/py32/lib/collections.py'
    >>> imp.cache_from_source('c:/py32/lib/collections.py') 
    'c:/py32/lib/__pycache__/collections.cpython-32.pyc'
  • py_compile および compileall モジュールが更新され、新しい命名規則とターゲットディレクトリが反映されました。 compileall のコマンドライン呼び出しには、新しいオプションがあります。コンパイルするファイルとディレクトリのリストを指定する-iと、バイトコードファイルをレガシーに書き込む-bです。 __ pycache __ ではなく場所。

  • importlib.abc モジュールは、バイトコードファイルをロードするための新しい抽象基本クラスで更新されました。 廃止されたABC PyLoaderおよびPyPycLoaderは非推奨になりました(Python 3.1との互換性を維持する方法の説明はドキュメントに含まれています)。

も参照してください

PEP 3147 -PYCリポジトリディレクトリ
バリーワルシャワによって書かれたPEP。


PEP 3149:ABIバージョンのタグ付き.soファイル

PYCリポジトリディレクトリを使用すると、複数のバイトコードキャッシュファイルを同じ場所に配置できます。 このPEPは、共有オブジェクトファイルに共通のディレクトリとバージョンごとに異なる名前を付けることにより、同様のメカニズムを実装します。

共通ディレクトリは「pyshared」であり、ファイル名は、Python実装(CPython、PyPy、Jythonなど)、メジャーバージョン番号とマイナーバージョン番号、およびオプションのビルドフラグ(「d」など)を識別することによって区別されます。デバッグ、pymallocの場合は「m」、ワイドユニコードの場合は「u」)。 任意のパッケージ「foo」の場合、配布パッケージのインストール時に次のファイルが表示される場合があります。

/usr/share/pyshared/foo.cpython-32m.so
/usr/share/pyshared/foo.cpython-33md.so

Python自体では、タグは sysconfig モジュールの関数からアクセスできます。

>>> import sysconfig
>>> sysconfig.get_config_var('SOABI')       # find the version tag
'cpython-32mu'
>>> sysconfig.get_config_var('EXT_SUFFIX')  # find the full filename extension
'.cpython-32mu.so'

も参照してください

PEP 3149 -ABIバージョンタグ付き.soファイル
バリーワルシャワによって書かれたPEP。


PEP 3333:PythonWebサーバーゲートウェイインターフェイスv1.0.1

この情報PEPは、バイト/テキストの問題がWSGIプロトコルによってどのように処理されるかを明確にします。 課題は、HTTPプロトコル自体がバイト指向であっても、Python3での文字列処理が str タイプで最も便利に処理されることです。

PEPは、要求/応答ヘッダーとメタデータに使用されるいわゆるネイティブ文字列と、要求と応答の本文に使用されるバイト文字列を区別します。

ネイティブ文字列は常にタイプ str ですが、 U + 0000 から U + 00FF までのコードポイントに制限されています。 Latin-1 エンコーディングを使用するバイト。 これらの文字列は、環境ディクショナリのキーと値、およびstart_response()関数の応答ヘッダーとステータスに使用されます。 エンコーディングに関しては、 RFC 2616 に従う必要があります。 つまり、 ISO-8859-1 文字であるか、 RFC 2047 MIMEエンコーディングを使用する必要があります。

Python 2からWSGIアプリケーションを移植する開発者にとって、重要なポイントは次のとおりです。

  • アプリがすでにPython2のヘッダーに文字列を使用している場合、変更は必要ありません。
  • 代わりに、アプリでエンコードされた出力ヘッダーまたはデコードされた入力ヘッダーの場合、ヘッダーをLatin-1に再エンコードする必要があります。 たとえば、utf-8でエンコードされた出力ヘッダーはh.encode('utf-8')を使用していましたが、h.encode('utf-8').decode('latin-1')を使用してバイトからネイティブ文字列に変換する必要があります。
  • アプリケーションによって生成される値、またはwrite()メソッドを使用して送信される値は、バイト文字列である必要があります。 start_response()関数と環境はネイティブ文字列を使用する必要があります。 この2つを混在させることはできません。

CGIからWSGIへの経路または他のCGIスタイルのプロトコルを作成するサーバー実装者の場合、基盤となるプラットフォームの規則が異なる場合でも、ユーザーはネイティブ文字列を使用して環境にアクセスできる必要があります。 このギャップを埋めるために、 wsgiref モジュールには、 os.environ からネイティブ文字列にCGI変数をトランスコードするための新しい関数 wsgiref.handlers.read_environ()があります。新しい辞書を返します。

も参照してください

PEP 3333 -PythonWebサーバーゲートウェイインターフェイスv1.0.1
フィリップエビーによって書かれたPEP。


その他の言語の変更

コアPython言語に加えられたいくつかの小さな変更は次のとおりです。

  • format()および str.format()の文字列フォーマットは、フォーマット文字の新機能を取得しました。 以前は、2進数、8進数、または16進数の整数の場合、出力の前にそれぞれ「0b」、「0o」、または「0x」が付けられていました。 これで、float、complex、およびDecimalも処理できるようになり、数字が続かない場合でも、出力に常に小数点が付きます。

    >>> format(20, '#o')
    '0o24'
    >>> format(12.34, '#5.0f')
    '  12.'

    (Mark Dickinsonによって提案され、:issue: `7094` でEricSmithによって実装されました。)

  • 任意の mapping オブジェクトを受け入れることにより、既存の str.format()メソッドの機能を拡張する新しい str.format_map()メソッドもあります。 この新しいメソッドにより、 defaultdictShelfConfigParserdbmなどのPythonの多くの辞書のようなオブジェクトで文字列フォーマットを使用できるようになります。 。 また、ルックアップの前にキーを正規化する、または不明なキーに対して__missing__()メソッドを提供する、カスタム dict サブクラスでも役立ちます。

    >>> import shelve
    >>> d = shelve.open('tmp.shl')
    >>> 'The {project_name} status is {status} as of {date}'.format_map(d)
    'The testing project status is green as of February 15, 2011'
    
    >>> class LowerCasedDict(dict):
    ...     def __getitem__(self, key):
    ...         return dict.__getitem__(self, key.lower())
    >>> lcd = LowerCasedDict(part='widgets', quantity=10)
    >>> 'There are {QUANTITY} {Part} in stock'.format_map(lcd)
    'There are 10 widgets in stock'
    
    >>> class PlaceholderDict(dict):
    ...     def __missing__(self, key):
    ...         return '<{}>'.format(key)
    >>> 'Hello {name}, welcome to {location}'.format_map(PlaceholderDict())
    'Hello <name>, welcome to <location>'

(Raymond Hettingerによって提案され、:issue: `6081` でEricSmithによって実装されました。)


  • インタプリタをクワイエットオプション-qで起動できるようになり、著作権とバージョン情報がインタラクティブモードで表示されないようになりました。 このオプションは、 sys.flags 属性を使用してイントロスペクトできます。

    $ python -q
    >>> sys.flags
    sys.flags(debug=0, division_warning=0, inspect=0, interactive=0,
    optimize=0, dont_write_bytecode=0, no_user_site=0, no_site=0,
    ignore_environment=0, verbose=0, bytes_warning=0, quiet=1)

    :issue: `1772833` のMarcinWojdyrによる寄稿)。

  • hasattr()関数は、 getattr()を呼び出し、例外が発生したかどうかを検出することで機能します。 この手法により、__getattr__()または__getattribute__()によって動的に作成されたメソッドを検出できます。これらのメソッドがなければ、クラスディクショナリには存在しません。 以前は、 hasattr は例外をキャッチし、真のエラーをマスクする可能性がありました。 現在、 hasattr は、 AttributeError のみをキャッチし、他の例外を通過させるように強化されています。

    >>> class A:
    ...     @property
    ...     def f(self):
    ...         return 1 // 0
    ...
    >>> a = A()
    >>> hasattr(a, 'f')
    Traceback (most recent call last):
      ...
    ZeroDivisionError: integer division or modulo by zero

    (Yury Selivanovによって発見され、BenjaminPetersonによって修正されました; :issue: `9666` 。)

  • 浮動数または複素数の str()は、その repr()と同じになりました。 以前は、 str()形式は短かったのですが、混乱が生じただけで、可能な限り短い repr()がデフォルトで表示されるようになったため、不要になりました。

    >>> import math
    >>> repr(math.pi)
    '3.141592653589793'
    >>> str(math.pi)
    '3.141592653589793'

    (MarkDickinsonによって提案および実装されました; :issue: `9337` 。)

  • memoryview オブジェクトに release()メソッドが追加され、コンテキスト管理プロトコルもサポートされるようになりました。 これにより、元のオブジェクトからバッファを要求したときに取得されたリソースをタイムリーに解放できます。

    >>> with memoryview(b'abcdefgh') as v:
    ...     print(v.tolist())
    [97, 98, 99, 100, 101, 102, 103, 104]

    (AntoinePitrouによって追加されました; :issue: `9757` 。)

  • 以前は、ネストされたブロックで自由変数として名前が発生した場合、ローカル名前空間から名前を削除することは違法でした。

    def outer(x):
        def inner():
            return x
        inner()
        del x

    これは現在許可されています。 exception 句のターゲットがクリアされているため、Python 2.6で機能していたこのコードは、Python3.1で SyntaxError を発生させ、再び機能するようになりました。

    def f():
        def print_error():
            print(e)
        try:
            something
        except Exception as e:
            print_error()
            # implicit "del e" here

    :issue: `4617` を参照してください。)

  • 内部のstructsequenceツールは、タプルのサブクラスを作成するようになりました。 これは、 os.stat()time.gmtime()、および sys.version_info によって返されるようなC構造体がのように機能することを意味します。 tuple という名前で、引数としてタプルを期待する関数とメソッドで動作するようになりました。 これは、C構造体を純粋なPython構造体と同じくらい柔軟にするための大きな前進です。

    >>> import sys
    >>> isinstance(sys.version_info, tuple)
    True
    >>> 'Version %d.%d.%d %s(%d)' % sys.version_info 
    'Version 3.2.0 final(0)'

    (Arfrever Frehtes Taifersar Arahesisによって提案され、:issue: `8413` でBenjaminPetersonによって実装されました。)

  • コマンドラインで-Wを使用する代わりに、 PYTHONWARNINGS 環境変数を使用すると、警告を簡単に制御できるようになりました。

    $ export PYTHONWARNINGS='ignore::RuntimeWarning::,once::UnicodeWarning::'

    (Barry Warsawによって提案され、Philip Jenveyによって:issue: `7301` に実装されました。)

  • 新しい警告カテゴリ ResourceWarning が追加されました。 リソース消費またはクリーンアップに関する潜在的な問題が検出されたときに発行されます。 通常のリリースビルドではデフォルトで無音になっていますが、 warnings モジュールまたはコマンドラインで提供される手段を使用して有効にすることができます。

    gc.garbage リストが空でない場合、 ResourceWarning がインタープリターのシャットダウン時に発行され、 gc.DEBUG_UNCOLLECTABLE が設定されている場合、収集できないオブジェクトがすべて出力されます。 これは、コードにオブジェクトのファイナライズの問題が含まれていることをプログラマーに認識させるためのものです。

    ResourceWarning は、ファイルオブジェクトが明示的に閉じられずに破棄された場合にも発行されます。 このようなオブジェクトのデロケーターは、基盤となるオペレーティングシステムリソース(通常はファイル記述子)を確実に閉じますが、オブジェクトの割り当て解除の遅延により、特にWindowsでさまざまな問題が発生する可能性があります。 コマンドラインから警告を有効にする例を次に示します。

    $ python -q -Wdefault
    >>> f = open("foo", "wb")
    >>> del f
    __main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='foo'>

    (AntoinePitrouとGeorgBrandlによって:issue: `10093`:issue:` 477863` に追加されました。)

  • range オブジェクトは、 index および count メソッドをサポートするようになりました。 これは、より多くのオブジェクトにcollections.Sequence 抽象基本クラスを完全に実装させるための取り組みの一環です。 その結果、言語のAPIはより統一されます。 さらに、 range オブジェクトは、 sys.maxsize より大きい値であっても、スライスと負のインデックスをサポートするようになりました。 これにより、 range はリストとの相互運用性が向上します。

    >>> range(0, 100, 2).count(10)
    1
    >>> range(0, 100, 2).index(10)
    5
    >>> range(0, 100, 2)[5]
    10
    >>> range(0, 100, 2)[0:5]
    range(0, 10, 2)

    :issue: `9213` のDanielStutzbach、:issue:` 2690` のAlexanderBelopolsky、:issue: `10889`のNickCoghlanによる寄稿。)

  • Py2.xの callable()組み込み関数が復活しました。 これは、isinstance(x, collections.Callable)のような式で abstract基本クラスを使用する代わりに、簡潔で読みやすい代替手段を提供します。

    >>> callable(max)
    True
    >>> callable(20)
    False

    :issue: `10518` を参照してください。)

  • Pythonのインポートメカニズムは、パス名に非ASCII文字が含まれるディレクトリにインストールされたモジュールをロードできるようになりました。 これにより、ユーザー名にASCII以外の文字が含まれるユーザーのホームディレクトリに関する深刻な問題が解決されました。

:issue: `9425` でVictorStinnerによる広範な作業が必要です。)


新規、改善、および非推奨のモジュール

Pythonの標準ライブラリは、大幅なメンテナンス作業と品質の向上を経ています。

Python 3.2の最大のニュースは、 email パッケージ、 mailbox モジュール、および nntplib モジュールがPython3のバイト/テキストモデルで正しく機能するようになったことです。 初めて、混合エンコーディングのメッセージが正しく処理されるようになりました。

標準ライブラリ全体を通して、エンコーディングとテキスト対バイトの問題により注意が払われてきました。 特に、オペレーティングシステムとの対話では、Windows MBCSエンコーディング、ロケール対応エンコーディング、またはUTF-8を使用して非ASCIIデータをより適切に交換できるようになりました。

もう1つの重要な利点は、 SSL 接続とセキュリティ証明書のサポートが大幅に向上したことです。

さらに、コンテキストマネージャーを実装するクラスが増え、 with ステートメントを使用した便利で信頼性の高いリソースクリーンアップがサポートされるようになりました。

Eメール

Python3での email パッケージの使いやすさは、Rの多大な努力によってほとんど修正されました。 デビッドマレー。 問題は、電子メールは通常、 str テキストではなく bytes の形式で読み取られて保存され、1つの電子メール内に複数のエンコーディングが含まれる場合があることでした。 そのため、電子メールパッケージを拡張して、バイト形式の電子メールメッセージを解析および生成する必要がありました。

  • 新しい関数 message_from_bytes()message_from_binary_file()、および新しいクラス BytesFeedParserBytesParser により、バイナリメッセージデータをモデルオブジェクトに解析できます。

  • モデルに入力されたバイトを指定すると、 get_payload()は、デフォルトで、 8ビットContent-Transfer-Encoding を持つメッセージ本文をで指定された文字セットを使用してデコードします。 MIMEヘッダーを取得し、結果の文字列を返します。

  • モデルに入力されたバイトを指定すると、 Generator は、 Content-Transfer-Encoding8bit のメッセージ本文を、代わりに 7bit に変換します。 ] Content-Transfer-Encoding

    エンコードされていない非ASCIIバイトのヘッダーは、 RFC 2047 と見なされます- unknown-8bit 文字セットを使用してエンコードされます。

  • 新しいクラス BytesGenerator は、出力としてバイトを生成し、 Content-Transfer-Encoding のメッセージ本文など、モデルの構築に使用される入力に存在した変更されていない非ASCIIデータを保持します。 8ビットの。

  • smtplib SMTP クラスは、 sendmail()メソッドの msg 引数のバイト文字列と、新しいメソッド[ X150X] send_message()は、 Message オブジェクトを受け入れ、オプションで from_addr および to_addrs アドレスをオブジェクトから直接取得できます。

(Rによって提案および実装されました。 デビッドマレー、:issue: `4661` および:issue:` 10321` 。)


elementtree

xml.etree.ElementTree パッケージとそれに対応するxml.etree.cElementTreeパッケージがバージョン1.3に更新されました。

いくつかの新しく便利な関数とメソッドが追加されました。

2つのメソッドが非推奨になりました。

  • xml.etree.ElementTree.getchildren()は代わりにlist(elem)を使用してください。
  • xml.etree.ElementTree.getiterator()は代わりにElement.iterを使用してください。

アップデートの詳細については、FredrikLundhのWebサイトの Introducing ElementTree を参照してください。

(FlorentXiclunaとFredrikLundhによる寄稿、:issue: `6472` 。)


functools

  • functools モジュールには、関数呼び出しをキャッシュするための新しいデコレータが含まれています。 functools.lru_cache()は、結果が同じであると予想されるときはいつでも、外部リソースへの繰り返しのクエリを保存できます。

    たとえば、データベースクエリ関数にキャッシングデコレータを追加すると、一般的な検索のデータベースアクセスを節約できます。

    >>> import functools
    >>> @functools.lru_cache(maxsize=300)
    ... def get_phone_number(name):
    ...     c = conn.cursor()
    ...     c.execute('SELECT phonenumber FROM phonelist WHERE name=?', (name,))
    ...     return c.fetchone()[0]
    >>> for name in user_requests:        
    ...     get_phone_number(name)        # cached lookup

    有効なキャッシュサイズの選択を支援するために、ラップされた関数はキャッシュ統計を追跡するためにインストルメントされています。

    >>> get_phone_number.cache_info()     
    CacheInfo(hits=4805, misses=980, maxsize=300, currsize=300)

    phonelistテーブルが更新された場合、キャッシュの古い内容は次の方法でクリアできます。

    >>> get_phone_number.cache_clear()

    (Raymond Hettingerによる寄稿で、Jim Baker、Miki Tebeka、NickCoghlanのデザインアイデアを取り入れています。レシピ498245レシピ577479 、:issue: `10586` [X182Xを参照してください。 ]、および:issue: `10593` 。)

  • functools.wraps()デコレータは、元の呼び出し可能関数を指す__wrapped__属性を追加するようになりました。 これにより、ラップされた関数をイントロスペクトできます。 定義されている場合は、__annotations__もコピーします。 また、ラップされた呼び出し可能オブジェクトに対して定義されていない可能性のある__doc__などの欠落している属性も正常にスキップします。

    上記の例では、元の関数を復元することでキャッシュを削除できます。

    >>> get_phone_number = get_phone_number.__wrapped__    # uncached function

    (NickCoghlanとTerrenceColeによる; :issue: `9567`:issue:` 3445` 、および:issue: `8814` 。)

  • 豊富な比較メソッドを使用してクラスを作成しやすくするために、新しいデコレータ functools.total_ordering()は、既存の等式および不等式メソッドを使用して残りのメソッドを埋めます。

    たとえば、 __ eq ____ lt __ を指定すると、 total_ordering()__ le ____ gt ____ ge __

    @total_ordering
    class Student:
        def __eq__(self, other):
            return ((self.lastname.lower(), self.firstname.lower()) ==
                    (other.lastname.lower(), other.firstname.lower()))
    
        def __lt__(self, other):
            return ((self.lastname.lower(), self.firstname.lower()) <
                    (other.lastname.lower(), other.firstname.lower()))

    total_ordering デコレータを使用すると、残りの比較メソッドが自動的に入力されます。

    (Raymond Hettingerによる寄稿。)

  • Python 2からのプログラムの移植を支援するために、 functools.cmp_to_key()関数は、古いスタイルの比較関数を最新のキー関数に変換します。

    >>> # locale-aware sort order
    >>> sorted(iterable, key=cmp_to_key(locale.strcoll))

    並べ替えの例と簡単な並べ替えのチュートリアルについては、並べ替えの方法チュートリアルを参照してください。

    (Raymond Hettingerによる寄稿。)


itertools

  • itertools モジュールには、APLの scan 演算子とNumpyの accumulate 関数をモデルにした新しい accumulate()関数があります。

    >>> from itertools import accumulate
    >>> list(accumulate([8, 2, 50]))
    [8, 10, 60]
    >>> prob_dist = [0.1, 0.4, 0.2, 0.3]
    >>> list(accumulate(prob_dist))      # cumulative probability distribution
    [0.1, 0.5, 0.7, 1.0]

    accumulate()の使用例については、ランダムモジュール例を参照してください。

    (Raymond Hettingerによって寄稿され、Mark Dickinsonからのデザイン提案が組み込まれています。)


コレクション

  • collections.Counter クラスには、飽和減算の既存の-= 演算子と新しい subtract()の2つの形式のインプレース減算があります。 通常の減算の方法。 前者は、正の数しか持たないマルチセットに適しており、後者は、負の数を許可するユースケースに適しています。

    >>> from collections import Counter
    >>> tally = Counter(dogs=5, cats=3)
    >>> tally -= Counter(dogs=2, cats=8)    # saturating subtraction
    >>> tally
    Counter({'dogs': 3})
    >>> tally = Counter(dogs=5, cats=3)
    >>> tally.subtract(dogs=2, cats=8)      # regular subtraction
    >>> tally
    Counter({'dogs': 3, 'cats': -5})

    (Raymond Hettingerによる寄稿。)

  • collections.OrderedDict クラスには、既存のキーを取得して順序付けられたシーケンスの最初または最後の位置に移動する新しいメソッド move_to_end()があります。

    デフォルトでは、アイテムを最後の位置に移動します。 これは、od[k] = od.pop(k)でエントリを更新するのと同じです。

    高速なエンドへの移動操作は、エントリの再シーケンスに役立ちます。 たとえば、順序付けされた辞書を使用して、最も古いものから最後にアクセスされたものまでエントリをエージングすることにより、アクセスの順序を追跡できます。

    >>> from collections import OrderedDict
    >>> d = OrderedDict.fromkeys(['a', 'b', 'X', 'd', 'e'])
    >>> list(d)
    ['a', 'b', 'X', 'd', 'e']
    >>> d.move_to_end('X')
    >>> list(d)
    ['a', 'b', 'd', 'e', 'X']

    (Raymond Hettingerによる寄稿。)

  • collections.deque クラスは、2つの新しいメソッド count()reverse()を拡張し、 list オブジェクトの代替可能性を高めました。

    >>> from collections import deque
    >>> d = deque('simsalabim')
    >>> d.count('s')
    2
    >>> d.reverse()
    >>> d
    deque(['m', 'i', 'b', 'a', 'l', 'a', 's', 'm', 'i', 's'])

    (Raymond Hettingerによる寄稿。)


糸脱毛

threading モジュールには、すべてのスレッドが共通のバリアポイントに到達するまで複数のスレッドを待機させるための新しい Barrier 同期クラスがあります。 バリアは、先行するすべてのタスクが完了するまで、複数の前提条件を持つタスクが実行されないようにするために役立ちます。

バリアは、任意の数のスレッドで機能します。 これは、2つのスレッドに対してのみ定義されている Rendezvous の一般化です。

2相循環バリアとして実装されたバリアオブジェクトは、ループでの使用に適しています。 個別の充填フェーズと排出フェーズにより、すべてのスレッドがループバックしてバリアに再び入る前に、すべてのスレッドが解放(排出)されます。 バリアは、各サイクル後に完全にリセットされます。

バリアの使用例:

from threading import Barrier, Thread

def get_votes(site):
    ballots = conduct_election(site)
    all_polls_closed.wait()        # do not count until all polls are closed
    totals = summarize(ballots)
    publish(site, totals)

all_polls_closed = Barrier(len(sites))
for site in sites:
    Thread(target=get_votes, args=(site,)).start()

この例では、バリアは、すべての投票が終了するまで、どの投票所でも投票をカウントできないというルールを適用します。 バリアを使用したソリューションが threading.Thread.join()を使用したソリューションとどのように似ているかに注意してください。ただし、バリアポイントを超えた後も、スレッドは存続し、作業を続けます(投票用紙の要約)。

先行タスクのいずれかがハングまたは遅延する可能性がある場合は、オプションの timeout パラメーターを使用してバリアを作成できます。 次に、すべての先行タスクがバリアポイントに到達する前にタイムアウト期間が経過すると、待機中のすべてのスレッドが解放され、 BrokenBarrierError 例外が発生します。

def get_votes(site):
    ballots = conduct_election(site)
    try:
        all_polls_closed.wait(timeout=midnight - time.now())
    except BrokenBarrierError:
        lockbox = seal_ballots(ballots)
        queue.put(lockbox)
    else:
        totals = summarize(ballots)
        publish(site, totals)

この例では、バリアはより堅牢なルールを適用します。 一部の選挙サイトが深夜までに終了しない場合、バリアのタイムアウトと投票用紙は封印され、後で処理するためにキューに入れられます。

並列コンピューティングでバリアを使用する方法のその他の例については、バリア同期パターンを参照してください。 また、 The Little Book of Semaphoressection 3.6 には、簡単ですが徹底的な障壁の説明があります。

:issue: `8777` のJeffreyYasskinによるAPIレビューでKristjánValurJónssonによって寄稿されました。)


日時

  • datetime モジュールには、固定UTCオフセットとタイムゾーン名を返すことによって tzinfo インターフェイスを実装する新しいタイプ timezone があります。 これにより、タイムゾーン対応の日時オブジェクトを簡単に作成できます。

    >>> from datetime import datetime, timezone
    
    >>> datetime.now(timezone.utc)
    datetime.datetime(2010, 12, 8, 21, 4, 2, 923754, tzinfo=datetime.timezone.utc)
    
    >>> datetime.strptime("01/01/2000 12:00 +0000", "%m/%d/%Y %H:%M %z")
    datetime.datetime(2000, 1, 1, 12, 0, tzinfo=datetime.timezone.utc)
  • また、 timedelta オブジェクトを float で乗算し、 float および int オブジェクトで除算できるようになりました。 また、 timedelta オブジェクトを互いに分割できるようになりました。

  • datetime.date.strftime()メソッドは、1900年以降の年に制限されなくなりました。 新しいサポートされる年の範囲は、1000から9999までです。

  • タイムタプルで2桁の年が使用される場合は常に、解釈はtime.accept2dyearによって管理されています。 デフォルトはTrueです。これは、2桁の年について、%y strptime形式を管理するPOSIXルールに従って世紀が推測されることを意味します。

    Py3.2以降、世紀を推測するヒューリスティックを使用すると、 DeprecationWarning が発行されます。 代わりに、time.accept2dyearFalseに設定して、推測に頼らずに広い日付範囲を使用できるようにすることをお勧めします。

    >>> import time, warnings
    >>> warnings.resetwarnings()      # remove the default warning filters
    
    >>> time.accept2dyear = True      # guess whether 11 means 11 or 2011
    >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
    Warning (from warnings module):
      ...
    DeprecationWarning: Century info guessed for a 2-digit year.
    'Fri Jan  1 12:34:56 2011'
    
    >>> time.accept2dyear = False     # use the full range of allowable dates
    >>> time.asctime((11, 1, 1, 12, 34, 56, 4, 1, 0))
    'Fri Jan  1 12:34:56 11'

    現在、いくつかの関数で日付範囲が大幅に拡張されています。 time.accept2dyearがfalseの場合、 time.asctime()関数は、C intに収まる任意の年を受け入れますが、 time.mktime()および[X142X ] time.strftime()関数は、対応するオペレーティングシステム関数でサポートされている全範囲を受け入れます。

:issue: `1289118`:issue:` 5094`:issue: `6641`のAlexanderBelopolskyとVictorStinnerによる寄稿]:issue: `2706`:issue:` 1777412`:issue: `8013` 、および:issue:` 10827` 。)


算数

math モジュールが更新され、C99標準に触発された6つの新機能が追加されました。

isfinite()関数は、特別な値を検出するための信頼性の高い高速な方法を提供します。 通常の数値の場合はTrueを返し、 Nan または Infinity の場合はFalseを返します。

>>> from math import isfinite
>>> [isfinite(x) for x in (123, 4.56, float('Nan'), float('Inf'))]
[True, True, False, False]

expm1()関数は、 x の小さな値に対してe**x-1を計算しますが、通常、ほぼ等しい量の減算に伴う精度の低下は発生しません。

>>> from math import expm1
>>> expm1(0.013671875)   # more accurate way to compute e**x-1 for a small x
0.013765762467652909

erf()関数は、確率積分またはガウス誤差関数を計算します。 相補誤差関数 erfc()は、1 - erf(x)です。

>>> from math import erf, erfc, sqrt
>>> erf(1.0/sqrt(2.0))   # portion of normal distribution within 1 standard deviation
0.682689492137086
>>> erfc(1.0/sqrt(2.0))  # portion of normal distribution outside 1 standard deviation
0.31731050786291404
>>> erf(1.0/sqrt(2.0)) + erfc(1.0/sqrt(2.0))
1.0

gamma()関数は、階乗関数の連続拡張です。 詳細については、 https://en.wikipedia.org/wiki/Gamma_functionを参照してください。 この関数は階乗に関連しているため、 x の値が小さい場合でも大きくなります。したがって、ガンマ関数の自然対数を計算するための lgamma()関数もあります。

>>> from math import gamma, lgamma
>>> gamma(7.0)           # six factorial
720.0
>>> lgamma(801.0)        # log(800 factorial)
4551.950730698041

(Mark Dickinsonによる寄稿。)


abc

abc モジュールは、 abstractclassmethod()および abstractstaticmethod()をサポートするようになりました。

これらのツールを使用すると、特定の classmethod()または staticmethod()を実装する必要がある抽象基本クラスを定義できます。

class Temperature(metaclass=abc.ABCMeta):
    @abc.abstractclassmethod
    def from_fahrenheit(cls, t):
        ...
    @abc.abstractclassmethod
    def from_celsius(cls, t):
        ...

(ダニエルアーバンによって提出されたパッチ; :issue: `5867` 。)


io

io.BytesIO には、 memoryview()と同様の機能を提供する新しいメソッド getbuffer()があります。 コピーを作成せずに、データの編集可能なビューを作成します。 バッファのランダムアクセスとスライス表記のサポートは、インプレース編集に最適です。

>>> REC_LEN, LOC_START, LOC_LEN = 34, 7, 11

>>> def change_location(buffer, record_number, location):
...     start = record_number * REC_LEN + LOC_START
...     buffer[start: start+LOC_LEN] = location

>>> import io

>>> byte_stream = io.BytesIO(
...     b'G3805  storeroom  Main chassis    '
...     b'X7899  shipping   Reserve cog     '
...     b'L6988  receiving  Primary sprocket'
... )
>>> buffer = byte_stream.getbuffer()
>>> change_location(buffer, 1, b'warehouse  ')
>>> change_location(buffer, 0, b'showroom   ')
>>> print(byte_stream.getvalue())
b'G3805  showroom   Main chassis    '
b'X7899  warehouse  Reserve cog     '
b'L6988  receiving  Primary sprocket'

:issue: `5506` のAntoinePitrouによる寄稿。)


reprlib

カスタムコンテナの__repr__()メソッドを作成する場合、メンバーがコンテナ自体を参照する場合の処理を忘れがちです。 listset などのPythonの組み込みオブジェクトは、表現文字列の再帰部分に「…」を表示することで自己参照を処理します。

このような__repr__()メソッドの記述を支援するために、 reprlib モジュールには、__repr__()への再帰呼び出しを検出し、代わりにプレースホルダー文字列:

>>> class MyList(list):
...     @recursive_repr()
...     def __repr__(self):
...         return '<' + '|'.join(map(repr, self)) + '>'
...
>>> m = MyList('abc')
>>> m.append(m)
>>> m.append('x')
>>> print(m)
<'a'|'b'|'c'|...|'x'>

:issue: `9826` および:issue:` 9840` でRaymondHettingerによって寄稿されました。)


ロギング

上記の辞書ベースの構成に加えて、 logging パッケージには他にも多くの改善があります。

ロギングドキュメントは、ロギングレシピの基本チュートリアル上級チュートリアル、およびクックブックによって拡張されています。 これらのドキュメントは、ロギングについて学ぶための最速の方法です。

logging.basicConfig()セットアップ関数は、3つの異なるタイプの文字列フォーマットをサポートするために style 引数を取得しました。 従来の%フォーマットの場合はデフォルトで「%」に設定され、新しい str.format()スタイルの場合は「{」に設定できます。提供されているシェルスタイルのフォーマットの場合は「$」に設定できます。 string.Template による。 次の3つの構成は同等です。

>>> from logging import basicConfig
>>> basicConfig(style='%', format="%(name)s -> %(levelname)s: %(message)s")
>>> basicConfig(style='{', format="{name} -> {levelname} {message}")
>>> basicConfig(style='$', format="$name -> $levelname: $message")

ロギングイベントが発生する前に構成がセットアップされていない場合、WARNINGレベルまたはより高い。 以前は、構成がセットアップされる前に発生したイベントは、logging.raiseExceptionsの値に応じて、例外を発生させるか、イベントをサイレントにドロップしていました。 新しいデフォルトハンドラーは logging.lastResort に保存されます。

フィルタの使用が簡素化されました。 Filter オブジェクトを作成する代わりに、述語はTrueまたはFalseを返す任意のPython呼び出し可能オブジェクトにすることができます。

柔軟性を追加し、構成を簡素化する他の多くの改善がありました。 Python 3.2での変更の完全なリストについては、モジュールのドキュメントを参照してください。


csv

csv モジュールは、新しい方言 unix_dialect をサポートするようになりました。これは、すべてのフィールドに引用符を適用し、'\n'を行末記号として使用する従来のUnixスタイルです。 登録されている方言名はunixです。

csv.DictWriter には、フィールド名を文書化するために最初の行を書き出すための新しいメソッド writeheader()があります。

>>> import csv, sys
>>> w = csv.DictWriter(sys.stdout, ['name', 'dept'], dialect='unix')
>>> w.writeheader()
"name","dept"
>>> w.writerows([
...     {'name': 'tom', 'dept': 'accounting'},
...     {'name': 'susan', 'dept': 'Salesl'}])
"tom","accounting"
"susan","sales"

:issue: `5975` でJayTalbotによって提案された新しい方言、および:issue:` 1537721` でEdAbrahamによって提案された新しい方法。)


contextlib

関数デコレータとしての役割を兼ねるコンテキストマネージャの作成に役立つ、新しくて少し驚異的なツール ContextDecorator があります。

便宜上、この新しい機能は contextmanager()によって使用されるため、両方の役割をサポートするために余分な労力は必要ありません。

基本的な考え方は、コンテキストマネージャーと関数デコレーターの両方をアクション前とアクション後のラッパーに使用できるということです。 コンテキストマネージャーは with ステートメントを使用してステートメントのグループをラップし、関数デコレーターは関数で囲まれたステートメントのグループをラップします。 そのため、どちらの役割でも使用できるアクション前またはアクション後のラッパーを作成する必要がある場合があります。

たとえば、関数またはステートメントのグループを、開始時刻と終了時刻を追跡できるロガーでラップすると便利な場合があります。 contextmanager()は、タスクの関数デコレータとコンテキストマネージャの両方を記述するのではなく、単一の定義で両方の機能を提供します。

from contextlib import contextmanager
import logging

logging.basicConfig(level=logging.INFO)

@contextmanager
def track_entry_and_exit(name):
    logging.info('Entering: %s', name)
    yield
    logging.info('Exiting: %s', name)

以前は、これはコンテキストマネージャーとしてのみ使用可能でした。

with track_entry_and_exit('widget loader'):
    print('Some time consuming activity goes here')
    load_widget()

これで、デコレータとしても使用できます。

@track_entry_and_exit('widget loader')
def activity():
    print('Some time consuming activity goes here')
    load_widget()

一度に2つの役割を果たそうとすると、テクニックにいくつかの制限があります。 コンテキストマネージャーは通常、 with ステートメントで使用できる引数を返す柔軟性を備えていますが、関数デコレーターに対応するものはありません。

上記の例では、 track_entry_and_exit コンテキストマネージャーが囲まれたステートメントの本文で使用するロギングインスタンスを返すクリーンな方法はありません。

:issue: `9110` でMichaelFoordによって寄稿されました。)


小数と分数

Mark Dickinsonは、実際の値が等しい場合は常に、異なる数値データ型が同じハッシュ値を持つことを保証するためのエレガントで効率的なスキームを作成しました(:issue: `8188` ):

assert hash(Fraction(3, 2)) == hash(1.5) == \
       hash(Decimal("1.5")) == hash(complex(1.5, 0))

ハッシュの詳細の一部は、ハッシュ値のビット幅、プライムモジュラス、無限大およびのハッシュ値を記述する新しい属性 sys.hash_info を通じて公開されます。 ] nan 、および数値の虚数部に使用される乗数:

>>> sys.hash_info 
sys.hash_info(width=64, modulus=2305843009213693951, inf=314159, nan=0, imag=1000003)

さまざまな数値タイプの相互運用性を制限するという初期の決定は緩和されました。 Decimal('1.1') + float('1.1')などの算術式で暗黙的なミキシングを行うことはまだサポートされていません(そしてお勧めできません)。後者はバイナリ浮動小数点を構築する過程で情報を失うからです。 ただし、既存の浮動小数点値は無損失で10進表現または有理数表現に変換できるため、それらをコンストラクターに追加し、混合型の比較をサポートすることは理にかなっています。

fractions.Fraction にも同様の変更が加えられ、 from_float()および from_decimal()メソッドが不要になりました(:issue: `8294 `):

>>> from decimal import Decimal
>>> from fractions import Fraction
>>> Decimal(1.1)
Decimal('1.100000000000000088817841970012523233890533447265625')
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)

10進数モジュールのもう1つの便利な変更は、Context.clamp属性がパブリックになったことです。 これは、IEEE 754で指定されている10進交換形式に対応するコンテキストを作成する場合に役立ちます(:issue: `8540` を参照)。

(MarkDickinsonとRaymondHettingerによる寄稿。)


ftp

ftplib.FTP クラスは、 socket.error 例外を無条件に消費し、完了したらFTP接続を閉じるためのコンテキスト管理プロトコルをサポートするようになりました。

>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
        ftp.login()
        ftp.dir()

'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora

mmap.mmapfileinput.input()などの他のファイルのようなオブジェクトも、自動クローズコンテキストマネージャーを拡張しました。

with fileinput.input(files=('log1.txt', 'log2.txt')) as f:
    for line in f:
        process(line)

:issue: `4972` のTarekZiadéとGiampaoloRodolà、および:issue:` 8046` と:issue: `1286` [のGeorgBrandlによる寄稿X143X]。)

FTP_TLS クラスは context パラメーターを受け入れるようになりました。これは ssl.SSLContext オブジェクトであり、SSL構成オプション、証明書、および秘密鍵を1つにバンドルできます(長い可能性があります)。 -生きた)構造。

(GiampaoloRodolàによる寄稿; :issue: `8806` 。)


ポペン

os.popen()および subprocess.Popen()関数は、ファイル記述子を自動的に閉じるための with ステートメントをサポートするようになりました。

:issue: `7461` および:issue:` 10554` のAntoinePitrouおよびBrianCurtinによる寄稿。)


選択する

select モジュールは、新しい定数属性 PIPE_BUF を公開するようになりました。これは、 select.select()のときにブロックされないことが保証される最小バイト数を示します。パイプは書く準備ができていると言います。

>>> import select
>>> select.PIPE_BUF  
512

(Unixシステムで利用できます。 のSébastienSabléによるパッチ:issue: `9862`


gzipとzipfile

gzip.GzipFile は、 io.BufferedIOBase abstract base class を実装するようになりました(truncate()を除く)。 また、 peek()メソッドがあり、シーク不可能なファイルオブジェクトとゼロが埋め込まれたファイルオブジェクトをサポートします。

gzip モジュールには、 compress()および decompress()関数も含まれているため、メモリ内の圧縮と解凍が簡単になります。 圧縮および解凍する前に、テキストを bytes としてエンコードする必要があることに注意してください。

>>> import gzip
>>> s = 'Three shall be the number thou shalt count, '
>>> s += 'and the number of the counting shall be three'
>>> b = s.encode()                        # convert to utf-8
>>> len(b)
89
>>> c = gzip.compress(b)
>>> len(c)
77
>>> gzip.decompress(c).decode()[:42]      # decompress and convert to text
'Three shall be the number thou shalt count'

(AnandBによる寄稿。 のPillai:issue: `3488` ; :issue: `9962`:issue:` 1675951`:issue: `7471` 、およびAntoine Pitrou、Nir Aides、BrianCurtinによる:issue: `2846` 。)

また、zipfile.ZipExtFileクラスは、アーカイブ内に保存されているファイルを表すように内部的に作り直されました。 新しい実装は大幅に高速化され、 io.BufferedReader オブジェクトでラップしてさらに高速化できます。 また、 readreadline へのインターリーブされた呼び出しが間違った結果をもたらす問題も解決します。

:issue: `7610` でNirAidesによって提出されたパッチ。)


tarfile

TarFile クラスをコンテキストマネージャーとして使用できるようになりました。 さらに、その add()メソッドには、アーカイブに追加するファイルを制御し、ファイルのメタデータを編集できるようにする新しいオプション filter があります。

新しい filter オプションは、廃止された古い、柔軟性の低い exclude パラメーターに置き換わるものです。 指定する場合、オプションの filter パラメーターはキーワード引数である必要があります。 ユーザー提供のフィルター関数は、 TarInfo オブジェクトを受け入れ、更新された TarInfo オブジェクトを返します。または、ファイルを除外する場合は、関数はNoneを返すことができます。

>>> import tarfile, glob

>>> def myfilter(tarinfo):
...     if tarinfo.isfile():             # only save real files
...         tarinfo.uname = 'monty'      # redact the user name
...         return tarinfo

>>> with tarfile.open(name='myarchive.tar.gz', mode='w:gz') as tf:
...     for filename in glob.glob('*.txt'):
...         tf.add(filename, filter=myfilter)
...     tf.list()
-rw-r--r-- monty/501        902 2011-01-26 17:59:11 annotations.txt
-rw-r--r-- monty/501        123 2011-01-26 17:59:11 general_questions.txt
-rw-r--r-- monty/501       3514 2011-01-26 17:59:11 prion.txt
-rw-r--r-- monty/501        124 2011-01-26 17:59:11 py_todo.txt
-rw-r--r-- monty/501       1399 2011-01-26 17:59:11 semaphore_notes.txt

(TarekZiadéによって提案され、:issue: `6856` でLarsGustäbelによって実装されました。)


hashlib

hashlib モジュールには、すべての実装に存在することが保証されているハッシュアルゴリズムと、現在の実装で使用可能なハッシュアルゴリズムを一覧表示する2つの新しい定数属性があります。

>>> import hashlib

>>> hashlib.algorithms_guaranteed
{'sha1', 'sha224', 'sha384', 'sha256', 'sha512', 'md5'}

>>> hashlib.algorithms_available
{'md2', 'SHA256', 'SHA512', 'dsaWithSHA', 'mdc2', 'SHA224', 'MD4', 'sha256',
'sha512', 'ripemd160', 'SHA1', 'MDC2', 'SHA', 'SHA384', 'MD2',
'ecdsa-with-SHA1','md4', 'md5', 'sha1', 'DSA-SHA', 'sha224',
'dsaEncryption', 'DSA', 'RIPEMD160', 'sha', 'MD5', 'sha384'}

:issue: `7418` でCarlChenetによって提案されました。)


ast

ast モジュールには、Pythonリテラル構文を使用して式文字列を安全に評価するための優れた汎用ツールがあります。 ast.literal_eval()関数は、悪用されやすい組み込みの eval()関数の安全な代替手段として機能します。 Python 3.2は、サポートされているタイプのリストに bytes および set リテラルを追加します:文字列、バイト、数値、タプル、リスト、dict、セット、ブール値、およびNone

>>> from ast import literal_eval

>>> request = "{'req': 3, 'func': 'pow', 'args': (2, 0.5)}"
>>> literal_eval(request)
{'args': (2, 0.5), 'req': 3, 'func': 'pow'}

>>> request = "os.system('do something harmful')"
>>> literal_eval(request)
Traceback (most recent call last):
  ...
ValueError: malformed node or string: <_ast.Call object at 0x101739a10>

(BenjaminPetersonとGeorgBrandlによって実装されました。)


os

さまざまなオペレーティングシステムが、ファイル名と環境変数にさまざまなエンコーディングを使用しています。 os モジュールは、ファイル名をエンコードおよびデコードするための2つの新しい関数 fsencode()および fsdecode()を提供します。

>>> import os
>>> filename = 'Sehenswürdigkeiten'
>>> os.fsencode(filename)
b'Sehensw\xc3\xbcrdigkeiten'

一部のオペレーティングシステムでは、環境内のエンコードされたバイトに直接アクセスできます。 その場合、 os.supports_bytes_environ 定数はtrueになります。

エンコードされた環境変数(使用可能な場合)に直接アクセスするには、新しい os.getenvb()関数を使用するか、 os.environのバイトバージョンである os.environb を使用します。 。

(Victor Stinnerによる寄稿。)


シャティル

shutil.copytree()関数には、2つの新しいオプションがあります。

  • ignore_dangling_symlinkssymlinks=Falseの場合、関数はシンボリックリンク自体ではなく、シンボリックリンクが指すファイルをコピーします。 このオプションは、ファイルが存在しない場合に発生するエラーを消音します。
  • copy_function :ファイルのコピーに使用される呼び出し可能オブジェクトです。 shutil.copy2()がデフォルトで使用されます。

(TarekZiadéによる寄稿。)

さらに、 shutil モジュールは、zipファイル、非圧縮tarファイル、gzip圧縮されたtarファイル、およびbzip圧縮されたtarファイルのアーカイブ操作をサポートするようになりました。 また、追加のアーカイブファイル形式(xz圧縮tarファイルやカスタム形式など)を登録するための関数があります。

主な関数は make_archive()unpack_archive()です。 デフォルトでは、どちらも現在のディレクトリ( os.chdir()で設定可能)と任意のサブディレクトリで動作します。 アーカイブファイル名は、フルパス名で指定する必要があります。 アーカイブ手順は非破壊的です(元のファイルは変更されません)。

>>> import shutil, pprint

>>> os.chdir('mydata')  # change to the source directory
>>> f = shutil.make_archive('/var/backup/mydata',
...                         'zip')      # archive the current directory
>>> f                                   # show the name of archive
'/var/backup/mydata.zip'
>>> os.chdir('tmp')                     # change to an unpacking
>>> shutil.unpack_archive('/var/backup/mydata.zip')  # recover the data

>>> pprint.pprint(shutil.get_archive_formats())  # display known formats
[('bztar', "bzip2'ed tar-file"),
 ('gztar', "gzip'ed tar-file"),
 ('tar', 'uncompressed tar file'),
 ('zip', 'ZIP file')]

>>> shutil.register_archive_format(     # register a new archive format
...     name='xz',
...     function=xz.compress,           # callable archiving function
...     extra_args=[('level', 8)],      # arguments to the function
...     description='xz compression'
... )

(TarekZiadéによる寄稿。)


sqlite3

sqlite3 モジュールがpysqliteバージョン2.6.0に更新されました。 2つの新機能があります。

  • sqlite3.Connection.in_transit属性は、コミットされていない変更に対してアクティブなトランザクションがある場合にtrueになります。
  • sqlite3.Connection.enable_load_extension()および sqlite3.Connection.load_extension()メソッドを使用すると、「。so」ファイルからSQLite拡張子を読み込むことができます。 よく知られている拡張機能の1つは、SQLiteで配布されている全文検索拡張機能です。

(Rによる寄稿。 デビッドマレイとシャシュワットアナンド; :issue: `8845` 。)


html

新しい html モジュールが導入され、HTMLマークアップから予約文字をエスケープするために使用される escape()という単一の関数のみが追加されました。

>>> import html
>>> html.escape('x > 2 && x < 7')
'x &gt; 2 &amp;&amp; x &lt; 7'

ソケット

socket モジュールには2つの新しい改善があります。

  • ソケットオブジェクトに detach()メソッドが追加され、基になるファイル記述子を実際に閉じずにソケットを閉じた状態にします。 後者は、他の目的に再利用できます。 (AntoinePitrouによって追加されました; :issue: `8524` 。)
  • socket.create_connection()は、 socket.error 例外を無条件に消費し、完了したらソケットを閉じるためのコンテキスト管理プロトコルをサポートするようになりました。 (GiampaoloRodolàによる寄稿; :issue: `9794` 。)


ssl

ssl モジュールは、安全な(暗号化、認証された)インターネット接続の一般的な要件を満たすためにいくつかの機能を追加しました。

  • 新しいクラス SSLContext は、プロトコル設定、証明書、秘密鍵、その他のさまざまなオプションなどの永続的なSSLデータのコンテナーとして機能します。 これには、SSLコンテキストからSSLソケットを作成するための wrap_socket()が含まれています。
  • 新しい関数 ssl.match_hostname()は、HTTPSのルール( RFC 2818 から)を実装することにより、高レベルプロトコルのサーバーID検証をサポートします。他のプロトコルにも適しています。
  • ssl.wrap_socket()コンストラクター関数が ciphers 引数を取るようになりました。 ciphers 文字列は、 OpenSSLドキュメントで説明されている形式を使用して許可される暗号化アルゴリズムを一覧表示します。
  • OpenSSLの最近のバージョンとリンクすると、 ssl モジュールはTLSプロトコルのサーバー名表示拡張をサポートするようになり、単一のIPポートで異なる証明書を使用する複数の「仮想ホスト」が可能になります。 この拡張機能はクライアントモードでのみサポートされ、 server_hostname 引数を ssl.SSLContext.wrap_socket()に渡すことでアクティブになります。
  • ssl モジュールには、安全でない廃止されたSSLv2プロトコルを無効にする OP_NO_SSLv2 など、さまざまなオプションが追加されています。
  • 拡張機能は、すべてのOpenSSL暗号とダイジェストアルゴリズムをロードするようになりました。 一部のSSL証明書を検証できない場合、それらは「不明なアルゴリズム」エラーとして報告されます。
  • 使用されているOpenSSLのバージョンには、モジュール属性 ssl.OPENSSL_VERSION (文字列)、 ssl.OPENSSL_VERSION_INFO (5タプル)、および ssl.OPENSSL_VERSION_NUMBERを使用してアクセスできるようになりました。 (整数)。

:issue: `8850`:issue:` 1589`:issue: `8322`:issueのAntoinePitrouによる寄稿: `5639`:issue:` 4870`:issue: `8484` 、および:issue:` 8321` 。)


nntp

nntplib モジュールの実装が改良され、バイトとテキストのセマンティクスが改善され、より実用的なAPIが追加されました。 これらの改善により、Python3.1のnntplibバージョンとの互換性が失われます。Python3.1自体は部分的に機能していませんでした。

暗黙的( nntplib.NNTP_SSL を使用)および明示的( nntplib.NNTP.starttls()を使用)TLSの両方を介した安全な接続のサポートも追加されました。

:issue: `9360` のAntoinePitrouと:issue:` 1926` のAndrewVantによる寄稿。)


証明書

http.client.HTTPSConnectionurllib.request.HTTPSHandler 、および urllib.request.urlopen()は、セットに対するサーバー証明書のチェックを可能にするオプションの引数を取るようになりました。 HTTPSの公的な使用で推奨されている認証局の数。

(Antoine Pitrou、:issue: `9003` によって追加されました。)


imaplib

新しい imaplib.IMAP4.starttls メソッドを介して、標準IMAP4接続での明示的なTLSのサポートが追加されました。

(LorenzoMによる寄稿。 Catucci and Antoine Pitrou、:issue: `4471` 。)


http.client

http.client モジュールにはいくつかの小さなAPIの改善がありました。 古いスタイルのHTTP0.9単純応答はサポートされなくなり、 strict パラメーターはすべてのクラスで非推奨になりました。

HTTPConnection および HTTPSConnection クラスに、HTTP接続の作成元を示す(ホスト、ポート)タプルの source_address パラメーターが追加されました。

証明書チェックとHTTPS仮想ホストのサポートが HTTPSConnection に追加されました。

接続オブジェクトの request()メソッドでは、オプションの body 引数を使用できるため、ファイルオブジェクトを使用してリクエストのコンテンツを提供できます。 便利なことに、 body 引数は、明示的なContent-Lengthヘッダーが含まれている限り、 iterable オブジェクトも受け入れるようになりました。 この拡張インターフェースは、以前よりもはるかに柔軟です。

プロキシサーバーを介してHTTPS接続を確立するために、HTTPConnectトンネリングのホストとポートを設定する新しい set_tunnel()メソッドがあります。

http.server の動作と一致するように、HTTPクライアントライブラリはISO-8859-1(Latin-1)エンコーディングでヘッダーもエンコードするようになりました。 すでに着信ヘッダーに対してこれを行っていたため、動作は着信トラフィックと発信トラフィックの両方で一貫しています。 (:issue: `10980` のArminRonacherの作品を参照してください。)


単体テスト

unittestモジュールには、パッケージのテスト検出をサポートする多くの改善、インタラクティブプロンプトでのより簡単な実験、新しいテストケースメソッド、テスト失敗の改善された診断メッセージ、およびより良いメソッド名があります。

  • コマンドライン呼び出しpython -m unittestは、特定のテストを実行するために、モジュール名の代わりにファイルパスを受け入れることができるようになりました(:issue: `10620` )。 新しいテスト検出では、パッケージ内のテストを検索し、最上位ディレクトリからインポート可能なテストを見つけることができます。 最上位ディレクトリは、 -t オプション、-pとファイルを照合するためのパターン、および-sで検出を開始するディレクトリで指定できます。

    $ python -m unittest discover -s my_proj_dir -p _test.py

    (Michael Foordによる寄稿。)

  • unittest.case.TestCaseクラスを引数なしでインスタンス化できるようになったため、インタラクティブプロンプトでの実験が簡単になりました。

    >>> from unittest import TestCase
    >>> TestCase().assertEqual(pow(2, 3), 8)

    (Michael Foordによる寄稿。)

  • unittest モジュールには、 assertWarns()assertWarnsRegex()の2つの新しいメソッドがあり、特定の警告タイプがテスト対象のコードによってトリガーされることを確認します。

    with self.assertWarns(DeprecationWarning):
        legacy_function('XYZ')

    (Antoine Pitrouによる寄稿、:issue: `9754` 。)

    別の新しいメソッド assertCountEqual()を使用して、2つの反復可能要素を比較し、それらの要素数が等しいかどうか(順序に関係なく、同じ要素が同じ出現回数で存在するかどうか)を判断します。

    def test_anagram(self):
        self.assertCountEqual('algorithm', 'logarithm')

    (Raymond Hettingerによる寄稿。)

  • unittestモジュールの主な機能は、テストが失敗したときに意味のある診断を生成するための取り組みです。 可能な場合は、出力の差分とともに障害が記録されます。 これは、失敗したテスト実行のログファイルを分析する場合に特に役立ちます。 ただし、差分は膨大な場合があるため、表示される差分の最大長を設定する新しい maxDiff 属性があります。

  • さらに、モジュール内のメソッド名は、いくつかのクリーンアップを受けています。

    たとえば、 assertRegex()assertRegexpMatches()の新しい名前ですが、テストで re.match(( )。 正規表現を使用する他のメソッドは、「Regexp」ではなく短い形式の「Regex」を使用して名前が付けられるようになりました。これは、他の単体テスト実装で使用される名前と一致し、 re モジュールのPythonの古い名前と一致し、明確です。キャメルケース。

    (Raymond Hettingerによって寄稿され、Ezio Melottiによって実装されました。)

  • 一貫性を向上させるために、いくつかの長年のメソッドエイリアスは非推奨になり、優先名が優先されます。

    旧名

    好ましい名称

    assert_()

    assertTrue()

    assertEquals()

    assertEqual()

    assertNotEquals()

    assertNotEqual()

    assertAlmostEquals()

    assertAlmostEqual()

    assertNotAlmostEquals()

    assertNotAlmostEqual()


    同様に、Python3.1で非推奨になったTestCase.fail*メソッドは、Python3.3で削除される予定です。 unittest ドキュメントの非推奨のエイリアスセクションも参照してください。

    (EzioMelottiによる寄稿; :issue: `9424` 。)

  • assertDictContainsSubset()メソッドは、間違った順序の引数で誤って実装されたため、非推奨になりました。 これにより、TestCase().assertDictContainsSubset({'a':1, 'b':2}, {'a':1})のようなテストが失敗するデバッグが難しい目の錯覚が生じました。

    (Raymond Hettingerによる寄稿。)


ランダム

random モジュールの整数メソッドは、一様分布を生成するためのより良い仕事をするようになりました。 以前は、 n が2の累乗でない場合は常にわずかなバイアスがあるint(n*random())を使用して選択を計算していました。 現在、2の次の累乗までの範囲から複数の選択が行われ、選択は0 <= x < nの範囲内にある場合にのみ保持されます。 影響を受ける関数とメソッドは、 randrange()randint()choice()shuffle()sampleです。 ()

(RaymondHettingerによる寄稿; :issue: `9025` 。)


poplib

POP3_SSL クラスは、 context パラメーターを受け入れるようになりました。これは ssl.SSLContext オブジェクトであり、SSL構成オプション、証明書、および秘密鍵を1つにバンドルできます(潜在的に長い-住んでいた)構造。

(GiampaoloRodolàによる寄稿; :issue: `8807` 。)


非同期

asyncore.dispatcher は、新しいリモートとの接続が実際に確立されたときに呼び出される(sock、addr)ペアを返す handle_accepted()メソッドを提供するようになりました。終点。 これは、古い handle_accept()の代わりに使用されることになっており、ユーザーが accept()を直接呼び出すことを回避します。

(GiampaoloRodolàによる寄稿; :issue: `6706` 。)


tempfile

tempfile モジュールには、新しいコンテキストマネージャー TemporaryDirectory があり、一時ディレクトリを簡単に確定的にクリーンアップできます。

with tempfile.TemporaryDirectory() as tmpdirname:
    print('created temporary dir:', tmpdirname)

(NeilSchemenauerとNickCoghlanによる寄稿; :issue: `5178` 。)


検査する

  • inspect モジュールには、ジェネレータイテレータの現在の状態を簡単に識別するための新しい関数 getgeneratorstate()があります。

    >>> from inspect import getgeneratorstate
    >>> def gen():
    ...     yield 'demo'
    >>> g = gen()
    >>> getgeneratorstate(g)
    'GEN_CREATED'
    >>> next(g)
    'demo'
    >>> getgeneratorstate(g)
    'GEN_SUSPENDED'
    >>> next(g, None)
    >>> getgeneratorstate(g)
    'GEN_CLOSED'

    (RodolphoEckhardtとNickCoghlanによる寄稿、:issue: `10220` 。)

  • 動的属性をアクティブ化する可能性なしにルックアップをサポートするために、 inspect モジュールには新しい関数 getattr_static()があります。 hasattr()とは異なり、これは真の読み取り専用検索であり、検索中に状態が変化しないことが保証されています。

    >>> class A:
    ...     @property
    ...     def f(self):
    ...         print('Running')
    ...         return 10
    ...
    >>> a = A()
    >>> getattr(a, 'f')
    Running
    10
    >>> inspect.getattr_static(a, 'f')
    <property object at 0x1022bd788>

(Michael Foordによる寄稿。)


pydoc

pydoc モジュールは、大幅に改善されたWebサーバーインターフェイスと、ブラウザウィンドウを自動的に開いてそのサーバーを表示する新しいコマンドラインオプション-bを提供するようになりました。

$ pydoc3.2 -b

(RonAdamによる寄稿; :issue: `2001` 。)


dis

dis モジュールは、コードを検査するための2つの新しい関数、 code_info()show_code()を取得しました。 どちらも、提供された関数、メソッド、ソースコード文字列、またはコードオブジェクトの詳細なコードオブジェクト情報を提供します。 前者は文字列を返し、後者はそれを出力します。

>>> import dis, random
>>> dis.show_code(random.choice)
Name:              choice
Filename:          /Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/random.py
Argument count:    2
Kw-only arguments: 0
Number of locals:  3
Stack size:        11
Flags:             OPTIMIZED, NEWLOCALS, NOFREE
Constants:
   0: 'Choose a random element from a non-empty sequence.'
   1: 'Cannot choose from an empty sequence'
Names:
   0: _randbelow
   1: len
   2: ValueError
   3: IndexError
Variable names:
   0: self
   1: seq
   2: i

さらに、 dis()関数は文字列引数を受け入れるようになったため、一般的なイディオムdis(compile(s, , 'eval'))dis(s)に短縮できます。

>>> dis('3*x+1 if x%2==1 else x//2')
  1           0 LOAD_NAME                0 (x)
              3 LOAD_CONST               0 (2)
              6 BINARY_MODULO
              7 LOAD_CONST               1 (1)
             10 COMPARE_OP               2 (==)
             13 POP_JUMP_IF_FALSE       28
             16 LOAD_CONST               2 (3)
             19 LOAD_NAME                0 (x)
             22 BINARY_MULTIPLY
             23 LOAD_CONST               1 (1)
             26 BINARY_ADD
             27 RETURN_VALUE
        >>   28 LOAD_NAME                0 (x)
             31 LOAD_CONST               0 (2)
             34 BINARY_FLOOR_DIVIDE
             35 RETURN_VALUE

これらの改善を総合すると、CPythonがどのように実装されているかを調べたり、言語構文が内部で何をしているのかを自分で確認したりするのが簡単になります。

:issue: `9147` でNickCoghlanによって寄稿されました。)


dbm

すべてのデータベースモジュールがget()およびsetdefault()メソッドをサポートするようになりました。

:issue: `9523` でRayAllenによって提案されました。)


ctypes

新しいタイプ ctypes.c_ssize_t は、C ssize_tデータ型を表します。


サイト

site モジュールには、特定のPythonインストールの詳細をレポートするのに役立つ3つの新しい関数があります。

  • getsitepackages()は、すべてのグローバルサイトパッケージディレクトリを一覧表示します。
  • getuserbase()は、データを保存できるユーザーのベースディレクトリについて報告します。
  • getusersitepackages()は、ユーザー固有のサイトパッケージディレクトリパスを表示します。
>>> import site
>>> site.getsitepackages()
['/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages',
 '/Library/Frameworks/Python.framework/Versions/3.2/lib/site-python',
 '/Library/Python/3.2/site-packages']
>>> site.getuserbase()
'/Users/raymondhettinger/Library/Python/3.2'
>>> site.getusersitepackages()
'/Users/raymondhettinger/Library/Python/3.2/lib/python/site-packages'

便利なことに、サイトの機能の一部には、コマンドラインから直接アクセスできます。

$ python -m site --user-base
/Users/raymondhettinger/.local
$ python -m site --user-site
/Users/raymondhettinger/.local/lib/python3.2/site-packages

:issue: `6693` のTarekZiadéによる寄稿。)


sysconfig

新しい sysconfig モジュールを使用すると、プラットフォームやインストールによって異なるインストールパスや構成変数を簡単に見つけることができます。

このモジュールは、プラットフォームおよびバージョン情報へのアクセスの簡単なアクセス機能を提供します。

また、 distutils で使用される7つの名前付きスキームの1つに対応するパスと変数へのアクセスも提供します。 それらには、 posix_prefixposix_homeposix_userntnt_useros2os2_home

  • get_paths()は、現在のインストールスキームのインストールパスを含む辞書を作成します。
  • get_config_vars()は、プラットフォーム固有の変数のディクショナリを返します。

便利なコマンドラインインターフェイスもあります。

C:\Python32>python -m sysconfig
Platform: "win32"
Python version: "3.2"
Current installation scheme: "nt"

Paths:
        data = "C:\Python32"
        include = "C:\Python32\Include"
        platinclude = "C:\Python32\Include"
        platlib = "C:\Python32\Lib\site-packages"
        platstdlib = "C:\Python32\Lib"
        purelib = "C:\Python32\Lib\site-packages"
        scripts = "C:\Python32\Scripts"
        stdlib = "C:\Python32\Lib"

Variables:
        BINDIR = "C:\Python32"
        BINLIBDEST = "C:\Python32\Lib"
        EXE = ".exe"
        INCLUDEPY = "C:\Python32\Include"
        LIBDEST = "C:\Python32\Lib"
        SO = ".pyd"
        VERSION = "32"
        abiflags = ""
        base = "C:\Python32"
        exec_prefix = "C:\Python32"
        platbase = "C:\Python32"
        prefix = "C:\Python32"
        projectbase = "C:\Python32"
        py_version = "3.2"
        py_version_nodot = "32"
        py_version_short = "3.2"
        srcdir = "C:\Python32"
        userbase = "C:\Documents and Settings\Raymond\Application Data\Python"

(TarekZiadéによってDistutilsから移動されました。)


pdb

pdb デバッガーモジュールは、いくつかの使いやすさの改善を獲得しました。

  • pdb.pyに、.pdbrcスクリプトファイルで指定されたコマンドを実行する-cオプションが追加されました。
  • .pdbrcスクリプトファイルには、デバッグを続行するcontinueおよびnextコマンドを含めることができます。
  • Pdbクラスコンストラクターは、 nosigint 引数を受け入れるようになりました。
  • 新しいコマンド:ソースコードを一覧表示するためのl(list)ll(long list)source
  • 新しいコマンド:displayおよびundisplayは、式が変更された場合にその値を表示または非表示にします。
  • 新しいコマンド:interactは、現在のスコープで見つかったグローバル名とローカル名を含む対話型インタープリターを開始します。
  • ブレークポイントは、ブレークポイント番号でクリアできます。

(Georg Brandl、Antonio Cuni、Ilya Sandlerによる寄稿。)


configparser

configparser モジュールが変更され、デフォルトのパーサーとサポートされているINI構文の使いやすさと予測可能性が向上しました。 古いConfigParserクラスは削除され、SafeConfigParserが優先され、 ConfigParser に名前が変更されました。 インラインコメントのサポートはデフォルトでオフになり、セクションまたはオプションの重複は単一の構成ソースでは許可されません。

構成パーサーは、マッピングプロトコルに基づいて新しいAPIを取得しました。

>>> parser = ConfigParser()
>>> parser.read_string("""
... [DEFAULT]
... location = upper left
... visible = yes
... editable = no
... color = blue
...
... [main]
... title = Main Menu
... color = green
...
... [options]
... title = Options
... """)
>>> parser['main']['color']
'green'
>>> parser['main']['editable']
'no'
>>> section = parser['options']
>>> section['title']
'Options'
>>> section['title'] = 'Options (editable: %(editable)s)'
>>> section['title']
'Options (editable: no)'

新しいAPIは従来のAPIの上に実装されているため、カスタムパーサーサブクラスは変更せずにそれを使用できるはずです。

構成パーサーが受け入れるINIファイル構造をカスタマイズできるようになりました。 ユーザーは、代替のオプション/値の区切り文字とコメントプレフィックスを指定したり、 DEFAULT セクションの名前を変更したり、補間構文を切り替えたりすることができます。

追加の補間ハンドラー ExtendedInterpolation を含む、プラグ可能な補間がサポートされています。

>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'},
...                   'custom': {'prefix': '/usr/local'}})
>>> parser.read_string("""
... [buildout]
... parts =
...   zope9
...   instance
... find-links =
...   ${buildout:directory}/downloads/dist
...
... [zope9]
... recipe = plone.recipe.zope9install
... location = /opt/zope
...
... [instance]
... recipe = plone.recipe.zope9instance
... zope9-location = ${zope9:location}
... zope-conf = ${custom:prefix}/etc/zope.conf
... """)
>>> parser['buildout']['find-links']
'\n/home/ambv/zope9/downloads/dist'
>>> parser['instance']['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance = parser['instance']
>>> instance['zope-conf']
'/usr/local/etc/zope.conf'
>>> instance['zope9-location']
'/opt/zope'

読み取り操作でのエンコードの指定、get関数のフォールバック値の指定、辞書や文字列からの直接読み取りのサポートなど、いくつかの小さな機能も導入されました。

(すべての変更はŁukaszLangaによって提供されました。)


urllib.parse

urllib.parse モジュールのユーザビリティが大幅に改善されました。

urlparse()関数は、 RFC 2732 で説明されているように、 IPv6 アドレスをサポートするようになりました。

>>> import urllib.parse
>>> urllib.parse.urlparse('http://[dead:beef:cafe:5417:affe:8FA3:deaf:feed]/foo/') 
ParseResult(scheme='http',
            netloc='[dead:beef:cafe:5417:affe:8FA3:deaf:feed]',
            path='/foo/',
            params='',
            query='',
            fragment='')

urldefrag()関数は、という名前のタプルを返すようになりました。

>>> r = urllib.parse.urldefrag('http://python.org/about/#target')
>>> r
DefragResult(url='http://python.org/about/', fragment='target')
>>> r[0]
'http://python.org/about/'
>>> r.fragment
'target'

また、 urlencode()関数ははるかに柔軟になり、 query 引数に文字列型またはバイト型のいずれかを受け入れるようになりました。 文字列の場合、 safeencoding 、および error パラメーターは、エンコードのために quote_plus()に送信されます。

>>> urllib.parse.urlencode([
...      ('type', 'telenovela'),
...      ('name', '¿Dónde Está Elisa?')],
...      encoding='latin-1')
'type=telenovela&name=%BFD%F3nde+Est%E1+Elisa%3F'

ASCIIエンコードバイトの解析で詳しく説明されているように、すべての urllib.parse 関数は、通常の文字列と混合されない限り、ASCIIエンコードバイト文字列を入力として受け入れるようになりました。 ASCIIエンコードされたバイト文字列がパラメータとして指定されている場合、戻りタイプもASCIIエンコードされたバイト文字列になります。

>>> urllib.parse.urlparse(b'http://www.python.org:80/about/') 
ParseResultBytes(scheme=b'http', netloc=b'www.python.org:80',
                 path=b'/about/', params=b'', query=b'', fragment=b'')

:issue: `2987`:issue:` 5468` 、および:issue: `9873` [のNickCoghlan、Dan Mahn、およびSenthilKumaranによる作業X125X]。)


メールボックス

Rによる協調的な努力に感謝します。 メールボックスモジュールのDavidMurrayは、Python3.2で修正されました。 課題は、メールボックスが元々テキストインターフェイスで設計されていたということでしたが、メッセージのさまざまな部分のエンコーディングが異なる可能性があるため、電子メールメッセージはバイトで表すのが最適です。

このソリューションは、 email パッケージのバイナリサポートを利用して任意の電子メールメッセージを解析しました。 さらに、このソリューションでは多くのAPIの変更が必要でした。

予想どおり、 mailbox.Mailbox オブジェクトの add()メソッドはバイナリ入力を受け入れるようになりました。

StringIO およびテキストファイル入力は非推奨です。 また、ASCII以外の文字が使用されている場合、文字列入力は早期に失敗します。 以前は、電子メールが後のステップで処理されたときに失敗していました。

バイナリ出力もサポートされています。 get_file()メソッドは、ファイルをバイナリモードで返すようになりました(以前はファイルをテキストモードに誤って設定していました)。 特定のキーに対応するメッセージのバイト表現を返す新しい get_bytes()メソッドもあります。

古いAPIの get_string()メソッドを使用して非バイナリ出力を取得することは引き続き可能ですが、そのアプローチはあまり役に立ちません。 代わりに、 Message オブジェクトからメッセージを抽出するか、バイナリ入力からメッセージをロードするのが最善です。

(Rによる寄稿。 David Murray、Steffen Daode Nurpmesoの努力と、:issue: `9124` のVictorStinnerによる最初のパッチ。)


タートルデモ

turtle モジュールのデモコードは、 Demo ディレクトリからメインライブラリに移動されました。 活気のあるディスプレイを備えた12以上のサンプルスクリプトが含まれています。 sys.path 上にあるため、コマンドラインから直接実行できるようになりました。

$ python -m turtledemo

:issue: `10199` のAlexanderBelopolskyによってデモディレクトリから移動されました。)


マルチスレッド

  • 同時に実行されているPythonスレッドの実行をシリアル化するメカニズム(一般に GIL またはGlobalInterpreter Lockとして知られています)が書き直されました。 目的の中には、より予測可能な切り替え間隔と、ロックの競合とそれに続くシステムコールの数によるオーバーヘッドの削減がありました。 スレッドの切り替えを可能にする「チェック間隔」の概念は廃止され、秒単位で表される絶対期間に置き換えられました。 このパラメーターは、 sys.setswitchinterval()を介して調整できます。 現在、デフォルトは5ミリ秒です。

    実装に関する追加の詳細は、 python-devメーリングリストメッセージから読み取ることができます(ただし、このメッセージで公開されている「優先リクエスト」は含まれていません)。

    (Antoine Pitrouによる寄稿。)

  • 通常および再帰ロックは、 accept()メソッドへのオプションの timeout 引数を受け入れるようになりました。 (AntoinePitrouによる寄稿; :issue: `7316` 。)

  • 同様に、 threading.Semaphore.acquire()timeout 引数を取得しました。 (TorstenLandschoffによる寄稿; :issue: `850728` 。)

  • 定期的および再帰的なロック取得は、Pthreadを使用するプラットフォーム上のシグナルによって中断できるようになりました。 これは、ロックの取得中にデッドロックが発生したPythonプログラムは、SIGINTをプロセスに繰り返し送信することで(ほとんどのシェルで Ctrl + C を押すことにより)正常に強制終了できることを意味します。 (ReidKlecknerによる寄稿; :issue: `8844` 。)


最適化

いくつかの小さなパフォーマンスの強化が追加されました。

  • Pythonののぞき穴オプティマイザーは、x in {1, 2, 3}などのパターンを一連の定数のメンバーシップのテストとして認識するようになりました。 オプティマイザーは、 setfrozenset として再キャストし、事前に作成された定数を格納します。

    速度のペナルティがなくなったので、集合の内包的記法を使用してメンバーシップテストの作成を開始するのが実用的です。 このスタイルは、意味的に明確であり、操作的に高速です。

    extension = name.rpartition('.')[2]
    if extension in {'xml', 'html', 'xhtml', 'css'}:
        handle(name)

    (DaveMalcolmによって提供されたパッチおよび追加のテスト; :issue: `6690` )。

  • pickle モジュールを使用したデータのシリアル化と非シリアル化が数倍高速になりました。

    :issue: `9410` および:issue:` 3873` で、Alexandre Vassalotti、Antoine Pitrou、およびUnladen Swallowチームによって寄稿されました。)

  • list.sort()および sorted()で使用される Timsortアルゴリズムは、キー関数で呼び出されたときに、より高速に実行され、より少ないメモリを使用するようになりました。 ]。 以前は、リストのすべての要素は、各要素に関連付けられたキー値を記憶する一時オブジェクトでラップされていました。 これで、キーと値の2つの配列が並行して並べ替えられます。 これにより、ソートラッパーによって消費されるメモリが節約され、比較の委任に費やされる時間が節約されます。

    :issue: `9915` のDanielStutzbachによるパッチ。)

  • 複数のキーに対して同じ文字列が繰り返されるたびに、JSONデコードのパフォーマンスが向上し、メモリ消費量が削減されます。 また、sort_keys引数がtrueの場合、JSONエンコーディングでCスピードアップが使用されるようになりました。

    :issue: `7451` のAntoinePitrouと、:issue:` 10314` のRaymondHettingerとAntoinePitrouによる寄稿。)

  • 再帰的ロック( threading.RLock() APIで作成)は、通常のロックと同じくらい高速で、以前の純粋なPython実装よりも10倍から15倍高速になるC実装の恩恵を受けるようになりました。

    (AntoinePitrouによる寄稿; :issue: `3001` 。)

  • stringlibの高速検索アルゴリズムは、バイト、[ X131X] bytearray および str オブジェクト。 同様に、このアルゴリズムはrfind()rindex()rsplit()、およびrpartition()でも使用されます。

    :issue: `7622` および:issue:` 7462` のFlorentXiclunaによるパッチ。)

  • 整数から文字列への変換は、一度に2つの「桁」で機能するようになり、除算とモジュロ演算の数が減りました。

    :issue: `6713` by Gawain Bolton、Mark Dickinson、およびVictor Stinner。)

他にもいくつかのマイナーな最適化がありました。 セットの差分は、一方のオペランドがもう一方のオペランドよりもはるかに大きい場合に高速に実行されるようになりました(:issue: `8685` のAndressBennettsによるパッチ)。 array.repeat()メソッドの実装は高速です(:issue: `1569291` by Alexander Belopolsky)。 BaseHTTPRequestHandlerは、より効率的なバッファリングを備えています(Andrew Schaafによる:issue: `3709` )。 operator.attrgetter()関数が高速化されました(:issue: `10160` by Christos Georgiou)。 また、ConfigParserは複数行の引数を少し速くロードします(:issue: `7113` byŁukaszLanga)。


Unicode

Pythonが Unicode 6.0.0 に更新されました。 この規格のアップデートにより、携帯電話にとって重要な絵文字記号を含む2,000を超える新しい文字が追加されました。

さらに、更新された標準により、2つのカンナダ語文字(U + 0CF1、U + 0CF2)と1つの新しいTai Lue数字(U + 19DA)の文字プロパティが変更され、前者は識別子で使用できるようになり、後者は失格になりました。 詳細については、 Unicode文字データベースの変更を参照してください。


コーデック

cp720 アラビア語DOSエンコーディング(:issue: `1616979` )のサポートが追加されました。

MBCSエンコーディングは、エラーハンドラ引数を無視しなくなりました。 デフォルトのstrictモードでは、デコードできないバイトシーケンスが発生すると UnicodeDecodeError が発生し、エンコードできない文字に対して UnicodeEncodeError が発生します。

MBCSコーデックは、デコード用に'strict'および'ignore'エラーハンドラーをサポートし、エンコード用に'strict'および'replace'をサポートします。

Python3.1 MBCSエンコーディングをエミュレートするには、デコード用に'ignore'ハンドラーを選択し、エンコーディング用に'replace'ハンドラーを選択します。

Mac OS Xでは、Pythonはロケールエンコーディングではなく'utf-8'を使用してコマンドライン引数をデコードします。

デフォルトでは、 tarfile は、Windowsでは'utf-8'エンコーディング('mbcs'ではなく)を使用し、すべてのオペレーティングシステムでは'surrogateescape'エラーハンドラーを使用します。


ドキュメンテーション

ドキュメントは引き続き改善されています。

  • 組み込み関数などの長いセクションの上部にクイックリンクの表が追加されました。 itertools の場合、リンクにはチートシートスタイルの要約の表が付属しており、すべてのドキュメントを読まなくても概要とメモリジョギングを提供します。

  • 場合によっては、純粋なPythonソースコードがドキュメントの補助として役立つことがあるため、多くのモジュールに最新バージョンのソースコードへのクイックリンクが追加されました。 たとえば、 functools モジュールのドキュメントには、上部に次のラベルの付いたクイックリンクがあります。

    ソースコード :source: `Lib / functools.py`.

    (RaymondHettingerによる寄稿。 rationale を参照してください。)

  • ドキュメントには、より多くの例とレシピが含まれるようになりました。 特に、 re モジュールには、正規表現の例という広範なセクションがあります。 同様に、 itertools モジュールは、新しい Itertools Recipes で引き続き更新されます。

  • datetime モジュールには、純粋なPythonでの補助実装が含まれるようになりました。 機能は変更されていません。 これは、読みやすい代替実装を提供するだけです。

    :issue: `9528` でAlexanderBelopolskyによって寄稿されました。)

  • メンテナンスされていないDemoディレクトリは削除されました。 一部のデモはドキュメントに統合され、一部はTools/demoディレクトリに移動され、その他は完全に削除されました。

    :issue: `7962` でGeorgBrandlによって寄稿されました。)


アイドル

  • フォーマットメニューに、末尾の空白を削除してソースファイルをクリーンアップするオプションが追加されました。

    (RaymondHettingerによる寄稿; :issue: `5150` 。)

  • Mac OS X上のIDLEは、CarbonAquaTkとCocoaAquaTkの両方で動作するようになりました。

    (Kevin Walzer、Ned Deily、およびRonaldOussorenによる寄稿; :issue: `6075` 。)


コードリポジトリ

http://svn.python.org にある既存のSubversionコードリポジトリに加えて、 https://hg.python.org/に Mercurial リポジトリがあります。 。

3.2リリース以降、プライマリリポジトリとしてMercurialに切り替える計画があります。 この分散バージョン管理システムにより、コミュニティのメンバーが外部のチェンジセットを簡単に作成および共有できるようになります。 詳細については、 PEP 385 を参照してください。

新しいバージョン管理システムの使用方法については、クイックスタートまたは Mercurialワークフローガイドを参照してください。


ビルドとCAPIの変更

PythonのビルドプロセスとCAPIへの変更は次のとおりです。

  • idlepydoc 、および 2to3 スクリプトが、make altinstall:issue: `10679]にバージョン固有のサフィックスとともにインストールされるようになりました。 `)。

  • UnicodeデータベースにアクセスするC関数は、狭いUnicodeビルド(Py_UNICODE_TOLOWER、Py_UNICODE_ISDECIMALなど)でも、Unicodeの全範囲の文字を受け入れて返すようになりました。 Pythonでの明らかな違いは、 unicodedata.numeric()が大きなコードポイントに対して正しい値を返すようになり、 repr()がより多くの文字を印刷可能と見なす可能性があることです。

    (Bupjoe Leeによって報告され、Amaury ForgeotD'Arcによって修正されました; :issue: `5127` 。)

  • 計算されたgotoは、サポートされているコンパイラ(configureスクリプトによって検出されます)でデフォルトで有効になりました。 --without-computed-gotosを指定することで、選択的に無効にすることができます。

    (AntoinePitrouによる寄稿; :issue: `9203` 。)

  • オプション--with-wctype-functionsは削除されました。 組み込みのUnicodeデータベースがすべての機能に使用されるようになりました。

    (Amaury ForgeotD'Arcによる寄稿; :issue: `9210` 。)

  • ハッシュ値は、新しいタイプPy_hash_tの値になりました。これは、ポインターと同じサイズになるように定義されています。 以前はタイプlongでしたが、一部の64ビットオペレーティングシステムではまだ32ビット長です。 この修正の結果、 set および dict は、64ビットポインターを使用するビルドで2**32を超えるエントリを保持できるようになりました(以前は、そのサイズに拡大する可能性がありました)しかし、それらのパフォーマンスは壊滅的に低下しました)。

    (Raymond Hettingerによって提案され、BenjaminPetersonによって実装されました; :issue: `9778` 。)

  • 新しいマクロPy_VA_COPYは、可変引数リストの状態をコピーします。 これはC99 va_copy と同等ですが、すべてのPythonプラットフォームで使用できます(:issue: `2443` )。

  • 新しいCAPI関数 PySys_SetArgvEx()を使用すると、組み込みインタープリターは sys.path:issue: `5753]を変更せずに sys.argv を設定できます。 `)。

  • PyEval_CallObjectは、マクロ形式でのみ使用できるようになりました。 下位互換性の理由で保持されていた関数宣言は削除されました–マクロは1997年に導入されました(:issue: `8276` )。

  • PyLong_AsLongAndOverflow()に類似した新しい関数 PyLong_AsLongLongAndOverflow()があります。 これらは両方とも、Python int をネイティブの固定幅型に変換すると同時に、変換が適合しない場合の検出を提供します(:issue: `7767` )。

  • PyUnicode_CompareWithASCIIString()関数は、Python文字列が NUL で終了している場合、等しくないを返すようになりました。

  • PyErr_NewException()に似ているが、docstringを指定できる新しい関数 PyErr_NewExceptionWithDoc()があります。 これにより、C例外は、純粋なPython例外(:issue: `7033` )と同じ自己文書化機能を持つことができます。

  • --with-valgrindオプションを使用してコンパイルすると、Valgrindで実行すると、pymallocアロケーターが自動的に無効になります。 これにより、Valgrindで実行しているときのメモリリーク検出が改善され、他のときはpymallocを利用できます(:issue: `2422` )。

  • PyArg_Parse 関数からO?形式を削除しました。 このフォーマットは使用されなくなり、文書化されたことはありません(:issue: `8837` )。

C-APIには他にもいくつかの小さな変更がありました。 完全なリストについては、:source: `Misc / NEWS` ファイルを参照してください。

また、Mac OS Xビルドには多くの更新がありました。詳細については、:source: `Mac / BuildScript / README.txt` を参照してください。 32/64ビットビルドを実行しているユーザーの場合、Mac OS X10.6のデフォルトのTcl / Tkに既知の問題があります。 したがって、 ActiveState Tcl / Tk 8.5.9 などの更新された代替をインストールすることをお勧めします。 詳細については、 https://www.python.org/download/mac/tcltk/を参照してください。


Python3.2への移植

このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。

  • configparser モジュールには、いくつかのクリーンアップがあります。 主な変更点は、古いConfigParserクラスを、長年使用されてきた代替のSafeConfigParserに置き換えることです。 さらに、いくつかの小さな非互換性があります。

    • 補間構文は、 get()および set()操作で検証されるようになりました。 デフォルトの補間スキームでは、パーセント記号の付いた2つのトークンのみが有効です。%(name)s%%で、後者はエスケープされたパーセント記号です。

    • set()および add_section()メソッドは、値が実際の文字列であることを確認するようになりました。 以前は、サポートされていないタイプが意図せずに導入される可能性がありました。

    • 単一のソースからの重複セクションまたはオプションにより、 DuplicateSectionError または DuplicateOptionError のいずれかが発生するようになりました。 以前は、重複すると前のエントリがサイレントに上書きされていました。

    • インラインコメントがデフォルトで無効になっているため、; 文字を値に安全に使用できるようになりました。

    • コメントをインデントできるようになりました。 したがって、; またはが複数行の値で行の先頭に表示されるようにするには、補間する必要があります。 これにより、値のコメントプレフィックス文字がコメントと間違われるのを防ぎます。

    • ""は有効な値になり、空の文字列に自動的に変換されなくなりました。 空の文字列の場合は、"option ="を1行で使用します。

  • nntplib モジュールは大幅に作り直されました。つまり、そのAPIは3.1APIと互換性がないことがよくあります。

  • bytearray オブジェクトをファイル名として使用できなくなりました。 代わりに、バイトに変換する必要があります。

  • array.tostring()array.fromstring()は、わかりやすくするためにarray.tobytes()array.frombytes()に名前が変更されました。 古い名前は非推奨になりました。 (:issue: `8990` を参照してください。)

  • PyArg_Parse*()関数:

    • 「t#」形式が削除されました。代わりに「s#」または「s *」を使用してください

    • 「w」および「w#」形式は削除されました。代わりに「w *」を使用してください

  • 3.1で廃止されたPyCObjectタイプは削除されました。 不透明なCポインターをPythonオブジェクトでラップするには、代わりに PyCapsule APIを使用する必要があります。 新しいタイプには、タイピングの安全性情報を渡すための明確に定義されたインターフェイスと、デストラクタを呼び出すためのそれほど複雑でない署名があります。

  • sys.setfilesystemencoding()機能は、設計に欠陥があるため削除されました。

  • random.seed()関数とメソッドは、sha512ハッシュ関数で文字列シードをソルトするようになりました。 以前のバージョンのシードにアクセスしてPython3.1シーケンスを再現するには、バージョン引数を 1random.seed(s, version=1)に設定します。

  • 以前に非推奨になったstring.maketrans()関数は削除され、静的メソッド bytes.maketrans()および bytearray.maketrans()が優先されます。 この変更により、 string モジュールでサポートされているタイプに関する混乱が解消されます。 現在、 strbytes 、および bytearray には、それぞれ独自の maketrans および translate メソッドと中間変換テーブルがあります。適切なタイプの。

    (GeorgBrandlによる寄稿; :issue: `5675` 。)

  • 以前に非推奨になったcontextlib.nested()関数は削除され、複数のコンテキストマネージャーを受け入れることができるプレーンな with ステートメントが採用されました。 後者の手法は(組み込みであるため)より高速であり、複数のコンテキストマネージャーの1つで例外が発生した場合に、それらをファイナライズするのに適しています。

    with open('mylog.txt') as infile, open('a.out', 'w') as outfile:
        for line in infile:
            if '<critical>' in line:
                outfile.write(line)

    (GeorgBrandlとMattiasBrändströmによる寄稿; appspot issue 53094 。)

  • struct.pack()は、s文字列パックコードのバイトのみを許可するようになりました。 以前は、テキスト引数を受け入れ、UTF-8を使用して暗黙的にバイトにエンコードしていました。 これは、正しいエンコーディングについての仮定を行い、構造の固定長セグメントへの書き込み時に可変長エンコーディングが失敗する可能性があるため、問題がありました。

    struct.pack('<6sHHBBB', 'GIF87a', x, y)などのコードは、テキストの代わりにバイトを使用するように書き直す必要がありますstruct.pack('<6sHHBBB', b'GIF87a', x, y)

    (David Beazleyによって発見され、VictorStinnerによって修正されました; :issue: `10783` 。)

  • xml.etree.ElementTree クラスは、解析が失敗したときに xml.etree.ElementTree.ParseError を発生させるようになりました。 以前は、 xml.parsers.expat.ExpatError が発生していました。

  • floatの新しい長い str()値は、古い出力形式に依存するdoctestを壊す可能性があります。

  • subprocess.Popen では、 close_fds のデフォルト値はUnixではTrueになりました。 Windowsでは、3つの標準ストリームがNoneに設定されている場合はTrue、それ以外の場合はFalseです。 以前は、 close_fds はデフォルトで常にFalseでした。これにより、開いているファイル記述子が子プロセスにリークする場合、バグや競合状態を解決するのが困難になりました。

  • 従来のHTTP0.9のサポートは、 urllib.request および http.client から削除されました。 このようなサポートは、サーバー側( http.server )でも引き続き存在します。

    (Antoine Pitrouによる寄稿、:issue: `10711` 。)

  • タイムアウトモードのSSLソケットは、タイムアウトが発生したときに、一般的な SSLError ではなく、 socket.timeout を発生させるようになりました。

    (Antoine Pitrouによる寄稿、:issue: `10272` 。)

  • 誤解を招く関数 PyEval_AcquireLock()および PyEval_ReleaseLock()は正式に非推奨になりました。 代わりに、スレッド状態に対応するAPI( PyEval_SaveThread()PyEval_RestoreThread()など)を使用する必要があります。

  • セキュリティ上のリスクにより、asyncore.handle_accept()は非推奨になり、新しい機能asyncore.handle_accepted()が追加されました。

    :issue: `6706` のGiampaoloRodolaによる寄稿。)

  • 新しい GIL の実装により、[X48X] Py_Initialize()の前に PyEval_InitThreads()を呼び出すことはできなくなりました。