Python

Python3.7の新機能

Python3.7の新機能

はじめに

Python3.5の新機能Python3.6の新機能に引き続きPython3.7の新機能に関してもまとめて行きたいと思う。まずは開発ロードマップ(PEP-537)。

  • 3.7.0 alpha 1: 2017-09-19 (完了)
  • 3.7.0 alpha 2: 2017-10-17 (完了)
  • 3.7.0 alpha 3: 2017-12-05 (完了)
  • 3.7.0 alpha 4: 2018-01-09 (完了)
  • 3.7.0 beta 1: 2018-01-31 (完了)
  • 3.7.0 beta 2: 2018-02-26 (完了)
  • 3.7.0 beta 3: 2018-03-26
  • 3.7.0 beta 4: 2018-04-30
  • 3.7.0 candidate 1: 2018-05-21
  • 3.7.0 candidate 2: 2018-06-04 (必要であれば)
  • 3.7.0 final: 2018-06-15

ベータの第二弾 3.7.0b2が出ました。正式版リリースは今年の6/15であと3ヶ月あまり。ベータになったのでもう大きな変更はないと思うが、
What’s New In Python 3.7の内容を正式リリースまで追いかけます。

更新履歴

2017.11.23

最初のバージョン。3.7.0a2を元にしています。

2017.12.06

3.7.0a3を元に以下を修正。

  • unittestの変更を追記
  • 開発者モード(developer mode)を開発モード(development mode)に改称
  • sys.flags.dev_modeに関して追記
  • 内包表記とジェネレータ式内でのyield式の非推奨について追記
  • re.splitのサポートパターン追加を追記。

2018.01.10

3.7.0a4を元に以下を修正。

  • ハッシュを利用したpycファイルに関して追記
  • -X devの記述を更新
  • PEP-540 「UTF-8モードの追加」を追記
  • contextlibの変更の記述を更新
  • 定数畳み込み最適化に関する変更を追記
  • PEP-562 「モジュール属性へのアクセスをカスタマイズ」を追記
  • subprocessの変更を追記
  • importlib.resources を追記
  • pdbの記述を追加
  • PEP-565 「__main__で非推奨警告を出す」を追記

2018.02.12

3.7.0b1を元に以下を修正。

  • PEP-563 「アノテーションの評価を遅らせる」を追記
  • PEP-557 「データクラス」を追加
  • 「collections.abc モジュールの仮想ベースクラス」を非推奨に追加
  • contextlib distutils hmac importlib locale py_compile ssl sys tkinter warningsモジュールの改善点を追記
  • 動作変更の欄に PEP-479が発動した件を追記
  • 削除されたサポートプラットフォームにFreeBSD 9を追加

2018.03.02

3.7.0b2を元に以下を修正。

  • PEP-567 「コンテキスト変数」を追加
  • types.TracebackTypeの変更を「その他の言語の変更」に追加
  • 「abcモジュールの関数とメソッドをCで再実装」、「datetime.datedatetime.datetimeのコンストラクタを変更」を「最適化」に追加
  • sslモジュールの改善点の記述を追加
  • deprecated を「非推奨」と訳すようにしました。

変更内容

新機能

PEP-538 過去の遺物であるCロケールの抑制

Pythonインタプリターのコマンドラインインターフェースで、Cロケール(POSIXロケール)を設定していたとしても、強制的にC.UTF-8C.utf8UTF-8のどれかに変更して実行を行うというもの。これにより、ロケールを解釈するC拡張モジュール(readlineなど)はASCIIの代りにUTF-8をデフォルトエンコーディングとして動作する。この動作は新たに導入されるPYTHONCOERCECLOCALEという環境変数によって制御が可能(0にすると以前のバージョンの動作に戻る)。また、これに伴い、stdinstdoutのデフォルトエラーハンドラーはsurrogateescapeになる。stderrはロケールに関わらずbackslashreplaceのまま。

PEP-553 組み込みブレークポイント

breakpoint()という組み込み関数を追加して、簡単に一貫性のある方法でデバッガを起動できるようにする。この関数はsys. breakpointhook()を呼び出す。このフックはデフォルトでは、pdbをインポートしてpdb.set_trace()を呼び出すという動作をするが、自分で他の関数をバインドすることも可能。あるいは、新設のPYTHONBREAKPOINT環境変数に同様にセットすることも可能だし、この環境変数を0に設定すればbreakpoint()機能を無効化もできる。

PEP-539 スレッド局所記憶にアクセスするための新たなC言語API

一つのプロセス内のスレッドは通常アドレス空間を共有しているが、スレッド毎に独立した記憶領域が欲しい場合がある。その為に各種プラットフォームで用意されている仕組みが
スレッド局所記憶(Thread local storage)である。Pythonでは従来Thread Local Storage(TLS) API というAPIでこれにアクセスしていたが、Keyの値が整数であるという想定を置いていた。これは全てのプラットフォームで成り立つ想定ではないため、新たにThread Specific Storage (TSS) APIを定義し、これによってTLS APIを置き換えることとした。

PEP-562 モジュール属性へのアクセスをカスタマイズ

モジュールレベルで__getattr__()を定義することができ、それによってモジュール属性へのアクセスをコントロールできるようになった。それにより、例えば非推奨の属性に対するアクセスが有った場合に警告メッセージをこれまでよりも容易に出せるようになった。

PEP-563 アノテーションの評価を遅らせる

アノテーションによって型ヒントを与えられるようになったが、それによって二つのちょっと目立つユーザビリティの問題を露呈させた。

  • アノテーションはすでに定義された名前に対してのみ付けられる。つまり、定義前の名前にアノテーションは付けられない(前方参照できない)
  • アノテーション付きのソースコードはPythonプログラムのスタート時間に悪影響がある

この問題を解決するために、アノテーションの評価をコンパイル時から実行時に必要な時のみ行われるよう変更した。 これにより、前方参照もできるようになったし、スタート時間も早くなった。

ただし、これは非互換性の変更なので、この動作を有効にするためには以下のimport文を入れる必要がある。

from __future__ import annotations

そしてこの機能はPython 4.0で標準動作になる予定。

PEP-564 ナノ秒の精度を持つ新たな時間関数

従来の時間関数のナノ秒精度を持つバージョンが追加された。

  • time.clock_gettime_ns()
  • time.clock_settime_ns()
  • time.monotonic_ns()
  • time.perf_counter_ns()
  • time.process_time_ns()
  • time.time_ns()

PEP-565 __main__で非推奨の警告を出す

Python 2.7と3.2で非推奨警告をデフォルトで出さない変更を加えたが、非互換の変更に事前に気がつくという本来の目的を果たせなくなっていた。そこで、そのモジュールが __main__で呼び出された時には非推奨警告を出すようにした。

PEP-540 UTF-8モードの追加

UTF-8モードが追加された。このモードではLocaleは無視してUTF-8エンコーディングが用いられる。そして、標準入出力のエラー処理には surrogateescapeが使用されます。このモードはPOSIX Locale以外ではデフォルトでオフになっているが、コマンドラインで -X utf8を付けるか、PYTHONUTF8環境変数を設定することでオンにすることができる。

PEP-557 データクラス

クラスのデコレータdataclassを提供する新たなモジュールdataclassesが追加された。これを付けると、クラスの変数アノテーションを見て、__init____repr____eq__などのメソッドを自動追加する。

PEP-567 コンテキスト変数

非ローカルな状態を管理維持しアクセスするためのAPIを提供するためにcontextvarsという新たなモジュールを追加した。

コンテキスト変数はasyncioでネイティブにサポートされていて、追加の設定変更なしに利用することができる。

decimalモジュールは現状の小数点コンテキストをコンテキスト変数で保持するようにアップデートされた。これにより、async/awaitの中でも正しいコンテキストで小数点演算が行えるようになった。

開発モードの追加: -X dev

コマンドライン・オプションに -X dev が追加され、サポートする環境変数にもPYTHONDEVMODEが追加された。これらを指定すると、デフォルトで有効にするにはオーバーヘッドのかかりすぎる実行時チェックなどが追加で実行される。

ハッシュを利用したpycファイル

Pythonはバイトコードコンパイルした結果をpycファイルにキャッシュとして格納する。その際に、元ファイルの最終更新時刻とサイズをpycファイルのヘッダに記録しておき、再コンパイルが必要かどうかを判断するのに使っていた。これは大概うまく動作するが、ファイルシステムの時刻の解像度が荒かったりすると再コンパイルが必要なのにしなかったりして混乱をもたらす可能性がある。また、時刻をキャッシュファイルに記録するのでビルドの再現性の点で問題になったりもする。

PEP-552では元ファイルのハッシュをpycファイルに記録出来るようにする拡張を提案している。通常の利用では引き続き時刻を元にした判断が行われハッシュをpycに記録することは無いが、ハッシュを利用したpycはpy_compilecompileallなどのモジュールで生成することができる。

ハッシュを記録したpycファイルには二種類有る。python実行時に更新確認をするものとしないものである。更新確認しないものは、外部のビルドシステムでpycの更新確認をする場合に有用である。

その他の言語の変更

  • 関数で256以上の引数をとれるようになった
  • bytes.fromhex()bytearray.fromhex() はスペースだけでなく、ASICIIの空白文字全てを無視するようになった。
  • from ... import ...ImportErrorになる時にモジュール名とモジュールのパスを表示するようになった。
import_error.py
from os import unknown_func
Python3.6
$ python3.6 import_error.py
Traceback (most recent call last):
  File "import_error.py", line 1, in <module>
    from os import unknown_func
ImportError: cannot import name 'unknown_func'
Python3.7
$ python3.7 import_error.py
Traceback (most recent call last):
  File "import_error.py", line 1, in <module>
    from os import unknown_func
ImportError: cannot import name 'unknown_func' from 'os' (/Users/ksato/.pyenv/versions/3.7.0a2/lib/python3.7/os.py)
  • サブモジュールを名前にバインドする絶対インポートを含む循環インポートが可能になった
  • object.__format__(x, '')str(x)と等価になった。
  • abcモジュールの関数とメソッドをCで再実装した。これにより、抽象基底クラスの生成とisinstance()、issubclass()の実行が1.5倍速くなり、Pythonの起動時間も最大10%速くなった。
  • スタックトレースの動的生成をより良くサポートするために、types.TracebackTypeはPythonコードからインスタンス化できるようになり、tracebacksのtb_next属性に書き込みできるようになった。

新規モジュール

importlib.resources

このモジュールは幾つかの新たなAPIと、一つの新たな仮想クラスを提供する。これにより、パッケージ内のリソースにアクセスしたり開いたり読んだりすることができるようになる。リソースはほぼほぼパッケージ内のファイルだが、物理的なファイルシステム上の実際のファイルである必要はない。モジュールローダーはget_resource_reader()関数を提供し、それがimportlib.abc.ResourceReader のインスタンスを返しこの新たなAPIのサポートを行う。組み込みのパスローダーとzipファイルローダーは双方ともこれをサポートする。

改善されたモジュール

argparse

parse_intermixed_args()でオプションと位置引数を混合することができるようになった。

binascii

b2a_uu()が* backtick*キーワード引数を取れるようになった。これが真の時はゼロがスペースの代りに'`'で表現される。

calendar

HTMLCalendarクラスに新たな属性が追加され、生成されるHTMLカレンダーのCSSをカスタマイズするのが容易になった。

cgi

parse_multipart() がFieldStorageと同じ結果を返すようになった。つまり、ファイルでないフィールドでは、キーに結び付けられるのはバイトではなく文字列のリスト。

contextlib

asynccontextmanager()AbstractAsyncContextManagerが追加された。

contextlib.AsyncExitStackが追加された。

cProfile

cProfileコマンドでスクリプトのパスを指定する代りに -mオプションでモジュール名を指定できるようになった。

crypt

Browfish暗号のサポートを追加。
mksalt()関数でハッシュの適応回数をパラメータで指定できるようになった。

dis

dis()関数でネストしたコードオブジェクトの逆アセンブルができるようになった。

distutils

README.rstがREADMEとして利用可能になった。

distutils.core.setupはclassifiers keywords platforms フィールドがリストか文字列で指定されていない場合には警告を出すようになった。

uploadコマンドは改行コードをCRからCRLFへ変更しないようになった。これにより、sdistでアップロードしたファイルの末尾がCRだった場合にファイルが壊れてしまう問題が解決された。

http.client

HTTPConnectionHTTPSConnectionでブロックサイズが変更可能になり、アップロードスループットを改善できる。

http.server

SimpleHTTPRequestHandlerが If-Modified-Sinceヘッダを解釈し、ターゲットのファイルがこのヘッダで指定された時刻から更新されていなければ304を返すようになった。

SimpleHTTPRequestHandlerdirectoryパラメータと、http.serverモジュールのコマンドラインの--directoryオプションでサーブするディレクトリを指定できるようになった。

hmac

hmacモジュールは一回のみのダイジェスト計算に最適化されたdigest()関数を提供するようになった。これは通常のHMAC()よりも最大3倍速い。

importlib

パッケージからのリソース読み込みに対応するために`importlib.abc.ResourceReader`仮想ベースクラスが導入された。

locale

format_string() 関数にmonetary引数が追加された。これが真だとLC_MONETARYで定義された桁区切り文字をつかってグループ化を行う。

locale.getpreferredencoding()関数は、Android か UTF-8モード(-X utf8オプション)の場合に常に'UTF-8'を返すようになった。localeや do_setlocale 引数は無視される。

math

新たに導入されたremainder()関数が IEEE 754スタイルの剰余演算を提供する。

os

fwalk()でバイト列のパスをサポート
scandir()でファイルディスクリプタを引数としてとれるようになった。

試してみよう。

scandir_fd.py
import os
fd = os.open('.', os.O_DIRECTORY)
for f in os.scandir(fd):
  print(f)
Python3.6
$ python3.6 scandir_fd.py
Traceback (most recent call last):
  File "scandir_fd.py", line 3, in <module>
    for f in os.scandir(fd):
TypeError: scandir: path should be string, bytes, os.PathLike or None, not int
Python3.7
$ python3.7 scandir_fd.py
<DirEntry 'scandir_fd.py'>
<DirEntry 'import_error.py'>
<DirEntry '.python-version'>

確かに、3.6ではエラーになるが3.7だと問題なく動く。

pdb

set_trace()にキーワード(のみ)引数の headerが追加された。これを指定するとデバッグが始まる前に指定された文字列をコンソールに表示する。

pdbのコマンドラインは、スクリプトの代りに -m module_nameというパラメータを付けられるようになった。

py_compile

py_compile.compile()compileallは SOURCE_DATE_EPOCH環境変数を見るようになった。これにより、.pycファイルを再現可能な形でビルドすることができるようになった。

re

re.ASCIIre.LOCALEre.UNICODEをグループのスコープとして設定可能に。

re.splitr'\b''^$'(?=-)というような空の文字列にマッチするパターンを指定可能になった。

ssl

sslモジュールは、match_hostname()ではなくOpenSSLの組み込みAPIをホスト名やIPアドレスのチェックに使うようになった。値の確認はTLSハンドシェーク中に行われる。ホスト名が合わないなどの証明書検証のエラーは `SSLCertVerificationError` 例外があがり、TLS接続は適切なアラートメッセージを表示して失敗する。この新たな例外には付加情報が含まれている。また、ホスト名の検証は host_flagsによってカスタマイズできる。

sslモジュールはTLS拡張のSNI(Server Name Indication)でIPアドレスを送らないようにした(RFC-6066に準拠)。

match_hostname()www*.example.orgのように名前の中に*が含まれるワイルドカードをサポートしなくなった(*はホスト名の一番左に現れる時のみ有効)。

sslモジュールの暗号スイートの選択は、ハードコードされたホワイトリストではなく、ブラックリストを利用する方法がデフォルトとなった。そして、OpenSSLのセキュリティアップデートで利用不可となった暗号を利用可能にすることはできなくなった。デフォルトの暗号スイートの選択はコンパイル時に設定される。

国際化ドメイン名(IDNs)を含むサーバ証明書の検証のサポートを追加した。これによりssl.SSLSocket.server_hostname属性は、Uラベル形式(Unicodeでの表現、例えば "pythön.org") ではなくAラベル形式(Ascii Compatible Encodingでの表現、例えば "xn--pythn-mua.org") で期待されるホスト名を格納するようになった。

sslモジュールは予備的、実験的な位置付けでTLS 1.3とOpenSSL 1.1.1のサポートを追加した。

ssl.wrap_socket() は非推奨となり、代わりにSSLContext.wrap_socket()を使うようにドキュメントが修正された。

SSLSocketとSSLObjectは公開されたコンストラクターを持たなくなった。これらを直接インスタンス化することは元来ドキュメント化されておらずサポートもされていなかった。これらのインスタンスはSSLContextのwrap_socket()wrap_bio()メソッドを使って生成すべきである。

OpenSSL 1.1のTLSプロトコルバージョンの上限・下限を設定するAPIはSSLContext.minimum_versionSSLContext.maximum_versionで利用可能になった。サポートされるバージョンはHAS_TLSv1_1のような新たなフラグで指定する。

string

string.Templateで'{'と'}'に囲まれたプレースホルダの正規表現を囲まれていないものと独立に指定できるようになった。

subprocess

Windows環境で close_fds のデフォルト値がFalseからTrueになった。これで全てのサポートプラットフォームでデフォルト値はTrueとなった。

sys

開発モードの追加に伴い、sys.flags.dev_modeフラグが属性として追加された。

sys.set_coroutine_wrapper()sys.get_coroutine_wrapper()は非推奨になった。

tkinter

tkinter.ttk.Spinbox が追加された。

time

PEP-564 によりナノ秒の精度を持つ新たな時間関数が追加された(上記で紹介済み)。

  • time.clock_gettime_ns()
  • time.clock_settime_ns()
  • time.monotonic_ns()
  • time.perf_counter_ns()
  • time.process_time_ns()
  • time.time_ns()

そして、新たな時間ID定数として以下が追加された。

  • time.CLOCK_BOOTTIME (Linux): time.CLOCK_MONOTONICと同等だが、システムが停止している時間も含む。
  • time.CLOCK_PROF (FreeBSD, NetBSD and OpenBSD): 高精度のプロセス毎のタイマー
  • time.CLOCK_UPTIME (FreeBSD, OpenBSD): 停止している時間を除くシステム稼働時間の絶対値

time.thread_time()time.thread_time_ns()関数が追加され、スレッドごとのCPU時間の測定ができるようになった。

unicodedata

unicodedataの内部データベースがUnicode 10を利用するようにアップグレードされた。

unittest

新たなコマンドライン・オプション-kが追加され、走らせるテストを部分文字列あるいはUnixのシェル風パターンで指定することができるようになった。例えば、python -m unittest -k foofoo_tests.SomeTest.test_somethingbar_tests.SomeTest.test_fooを走らせるが、bar_tests.FooTest.test_somethingは対象外となる。

unittest.mock

sentinel属性がcopyやpickleされても同一性確認できるようになった。

試してみた。

sentinel_test.py
from unittest.mock import sentinel
import copy
import pickle

a = sentinel.object_a
a2 = copy.copy(a)
print('a == a2: ', format(a==a2))
a3 = pickle.loads(pickle.dumps(a))
print('a == a3: ', format(a==a3))
Python3.6
$ python3.6 sentinel_test.py
a == a2:  False
a == a3:  False
Python3.7
$ python sentinel_test.py
a == a2:  True
a == a3:  True

また、新たな関数sealが導入され、それが適用されたモックオブジェクトでは新たな属性の読み書きができなくなる。(今のところ(3.7.0a2)、実装されていないようだ)

urllib.parse

urllib.parse.quote()が参照する仕様がRFC 2396 からRFC 3986に変更になり、'~'がデフォルトでクオートされない文字に追加された。

uu

encode()関数がbacktickキーワード引数をとれるようになった。これが真の時はゼロがスペースの代りに'`'で表現される。

warnings

警告フィルタの初期値が以下のように変更された

  • コマンドラインオプションで有効にされる警告(-b-X devオプションを含む)は常にsys.warnoptions属性経由で渡される
  • コマンドラインオプションで有効にされる警告は次の優先度順位を持つ
    • -b/-bbのためのBytesWarningフィルタ
    • -Wで指定されたフィルタ
    • PYTHONWARNINGSで指定されたフィルタ
    • その他のCPython特有のフィルタ(新たな-X devのために追加されたデフォルトフィルタなど)
    • 警告の仕組みで暗黙に定義されたフィルタ
  • CPythonのデバッグビルドではデフォルトで全ての警告が表示される

xml.etree

find()メソッドのXPath述語で[. = "text"]という形の記述が可能になり、小ノードのテキストだけでなく自ノードのテキストとの比較も可能になった。また、XPath述語に見やすさのために空白を入れられるようになった。

xmlrpc.server

xmlrpc.server.SimpleXMLRPCDispatcherとその継承クラスのregister_function()がデコーれーたとして利用可能になった。

zipapp

zipapp.create_archive()関数がfilter引数をとれるようになった。これによってどのファイルをアーカイブに含めるかをユーザが指定できるようになる。またcompressed引数あるいは--compressコマンドライン・オプションでで圧縮したアーカイブを作成できるようになった。

最適化

  • LOAD_METHODCALL_METHODという二つのオペコードが追加され、メソッド呼び出し時にバウンドメソッドオブジェクトのインスタンス化が不要となった。これによりメソッド呼び出しが最大20%高速になった。
  • 幾つかのUnicode文字(例えばウクライナ語の大文字の“Є”)は文字列中のサーチで他の文字よりも最大25倍遅かった。これが、最悪の場合でも3倍遅いだけになった。
  • mathモジュールのerf()とerfc()は標準Cライブラリの速い実装を使うようになった。
  • os.scandir()を使うことにより、os.fwalk() が2倍速くなった。(scandir()がファイルディスクリプタを引数に取れるようになったのもこのため?)
  • os.scandir()を使うことにより、shutil.rmtree() が20-40%速くなった。
  • 正規表現の大文字小文字を区別しないマッチングおよびサーチを最適化し、サーチは最大で20倍速くなった。
  • re.compile()はflagsパラメータがRegexFlagだった時にIntオブジェクトに変換するようになった。これによってPython3.5同様、Python3.6と較べて約10%高速になった。
  • selectors.EpollSelector.modify()、selectors.PollSelector.modify()、selectors.DevpollSelector.modify() は負荷の大きい状態で最大10%速くなった。
  • 定数畳み込みがピープホール最適化から新たなAST最適化へ移された。
  • datetime.datedatetime.datetimeのコンストラクタを変更し、サブクラスを作る時以外はfast-pathコンストラクタを使うようにした。これにより大幅に速度改善した。

ビルドとC APIの変更

  • OSX(macOS)ではないUnixで_ctypesモジュールをビルドするためにlibffiのコピーがバンドルされていたがこれを止めた。それらのプラットフォームでビルドするためにはlibffiを予めインストールしておく必要がある。
  • PyMemberDef、PyGetSetDef、PyStructSequence_Field、PyStructSequence_Desc、wrapperbase 構造体のnameとdocフィールドの型がchar*からconst char *になった。
  • PyUnicode_AsUTF8AndSize()とPyUnicode_AsUTF8()の返り値がchar*からconst char *になった。
  • PyMapping_Keys()、PyMapping_Values()、PyMapping_Items()の返り値はタプルかリストではなく常にリストとなった。
  • PySlice_Unpack()とPySlice_AdjustIndices()関数が追加された。
  • 新たにPyOS_BeforeFork()、PyOS_AfterFork_Parent()、PyOS_AfterFork_Child()が導入され、PyOS_AfterFork()は非推奨となった。
  • Windowsのビルドプロセスで外部のソースをプルのにSubversionに依存していたが、代りにPythonスクリプトがZIP化されたファイルをGitHubからダウンロードする形に変更された。仮にPython3.6がインストールされていなければ、NuGetを使って32bit版のPythonをそのためにダウンロードする。
  • PyExc_RecursionErrorInstシングルトンは公式APIの一部であったが、インタプリター終了時にSegmentation Falutを起こすことがあったので削除された。
  • ビルド時のオプション --without-threads は削除された。

その他のCPython実装の変更

  • トレースされているフレームのf_trace_lines属性をFalseにすることでトレースフックはラインイベントを受け取らなく出来る。
  • トレースされているフレームのf_trace_opcodes属性をTrueにすることでトレースフックはオペコードイベントを受け取れるようになる。

非推奨

  • collections.abcモジュールで提供されている仮想ベースクラスは通常のcollectionsモジュールからも利用可能だったが、これがPython 3.8以降できなくなる。
  • 内包表記とジェネレータ式内でのyield式 (yieldyield fromの双方)は非推奨となる。ただし、一番左のfor節内は除く。この変更により、内包表記は、ジェネレータイタレターオブジェクトではなく、常に適切な型のコンテナを即座に返すことができるようになる。そしてジェネレータ式はそれ自身の暗黙の出力と、明示的に示されたyield式からの出力を交互に出さなくて良くなる。Python3.7ではそのような式はDeprecationWarningをコンパイル時に出す。そしてPython3.8以降ではSyntaxErrorを出すようになる。
  • PySlice_GetIndicesEx() 関数は非推奨となり、Py_LIMITED_APIがセットされているか、セットされていてその値が0x030504000x03060000の間か0x03060100以上であるかを判定するマクロで置き換えられる。
  • localeモジュールのfomrat()は非推奨に。代りにformat_string()を使うべし。
  • Python3.4で非推奨になっているMetaPathFinder.find_module()(代替は MetaPathFinder.find_spec())とPathEntryFinder.find_loader()(代替はPathEntryFinder.find_spec())が DeprecationWarningを出すようになった。
  • gettextで非整数値で複数形を選ぶことを非推奨とした。これまでも正しく動いていませんでした。
  • macpathモジュールは非推奨となり、Python3.8で削除されます。

Changes in the C API

  • PyThread_start_new_thread()とPyThread_get_thread_ident()の返り値の型とPyThreadState_SetAsyncExc()のidパラメータの型がlongからunsigned longになった。
  • PyUnicode_AsWideCharString()は2つめのsizeパラメータがNULLで返り値の文字列がnull文字を含む場合はValueError例外が起こる様になった。

Windows のみ

  • Python起動プログラム(py.exe)は32bit/64bitの切り替えパラメータをPythonのマイナーバージョン無しで使えるようになった。なので、py -3.7-32だけでなく、py -3-32py -3-64という形でも起動できるようになった。
  • “py -0”で起動するとインストールされているPythonリストを表示する。デフォルトのPythonはアスタリスクが付く。また、“py -0p”で起動するとパスの情報を表示する。もしPyがインストールされていないバージョンを指定したら利用可能なバージョンのリストを表示する。

削除済み

プラットフォームサポートの削除

  • FreeBSD 9とそれ以前のバージョンはサポートされなくなった。

APIと機能の削除

  • os.stat_float_times()は削除された。これはPython2.2の後方互換の為に2.3で導入され、3.1で非推奨になっていた。
  • re.sub()の置き換えテンプレート内の、'\'とASCII文字からなる不明なエスケープ文字はPython 3.5で非推奨となっていたが、これからはエラーとなる。
  • tarfile.TarFile.add()のexclude引数は削除された。これはPython2.7と3.2で非推奨となっていた。代りにfilter引数を使うべし。
  • Python3.1で非推奨になっていたntpathモジュールの splitunc()関数が削除された。代りにsplitdrive()を使うべし。
  • collections.namedtuple()はverboseパラメータのサポートと生成された名前付きタプルのソースコードを表す_source属性のサポートを取りやめた。これはクラス生成の速度向上のための最適化の一貫である。
  • bool()、float()、list()、tuple()関数はキーワード引数を受け付けなくなった。また、int()の最初の引数も位置引数での受け渡しのみになった。
  • Python2.4で非推奨になっていたplistlibのPlistDict_InternalDictクラスが削除された。readPlist()とreadPlistFromBytes() の返り値は通常のマッピング型データである。

Python 3.7へのポーティング

ここでは、あなたのコードをPython3.7へポーティングする際に気をつけるべきことを挙げます。

Pythonの動作の変更

  • PEP-479 がすべてのコードに対して発動し、コルーチンやジェネレーターで挙げられたStopIteration例外はRuntimeError例外に変換される。

  • 初期のPythonでは以下のような構文を誤って受け付けていた。Python3.7ではこれは正しく構文エラーになる。ジェネレーター式はカッコで囲われ、左右どちらの側にもコンマがあってはならない。そしてカッコの重複の除去は関数呼び出しのときのみに行える。

f(1 for x in [1],)

class C(1 for x in [1]):
    pass

(Python APIの変更、C APIの変更、CPythonバイトコードの変更に関しては細かいので割愛)

ドキュメンテーション

PEP-545 Pythonドキュメントの翻訳

PEP 545ではPythonドキュメントの翻訳プロセスに関して記述している。二つの翻訳が追加された。