Python3.7の新機能

Python3.7の新機能
#はじめに
[Python3.5の新機能](http://qiita.com/ksato9700/items/9a0aef07d90d00e67525)、[Python3.6の新機能](https://qiita.com/ksato9700/items/ed839a6db6a671fd31e6)に引き続きPython3.7の新機能に関してもまとめて行きたいと思う。まずは開発ロードマップ([PEP-537](https://www.python.org/dev/peps/pep-0537/))。

* 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-29 (完了)
* 3.7.0 beta 4: 2018-05-02 (完了)
* 3.7.0 beta 5: 2018-05-30 (完了)
* 3.7.0 candidate 1: 2018-06-12 (完了)
* 3.7.0 final: 2018-06-27 (完了!!)

この記事を書き始めたのが去年(2017年)の11月だからほぼ7ヶ月かかりましたが、ようやく6/27に3.7.0最終版が出ました。[What’s New In Python 3.7](https://docs.python.org/3.7/whatsnew/3.7.html)の内容を追いかけて来ましたがこれが最後の更新になります。

##更新履歴
### 2017.11.23
最初のバージョン。3.7.0a2を元にしています。

### 2017.12.06
[3.7.0a3](https://www.python.org/downloads/release/python-370a3/)を元に以下を修正。

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

### 2018.01.10
[3.7.0a4](https://www.python.org/downloads/release/python-370a4/)を元に以下を修正。

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

### 2018.02.12
[3.7.0b1](https://www.python.org/downloads/release/python-370b1/)を元に以下を修正。

* 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](https://www.python.org/downloads/release/python-370b2/)を元に以下を修正。

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

### 2018.07.12
[3.7.0](https://www.python.org/downloads/release/python-370/)を元に以下を修正。

* リリースハイライトを追加
* PEP-560 「`typing`モジュールとジェネリック型のコアサポート」を追記
* `asyncio`、`collections`、`compileall`、`datetime`、`dbm`、`decimal`、`enum`、`functools`、`gc`、`idlelib/IDLE`、`io`、`ipaddress`、`itertools`、`logging`、`mimetypes`、`msilib`、`multiprocessing`、`pydoc`、`queue`、`signal`、`socket`、`socketserver`、`sqlite3`、`tracemalloc`、`types`、`uuid`、`zipfile`モジュールの改善点を追記
* 長くなりすぎたので「ビルドとC APIの変更」、「最適化」、「その他のCPython実装の変更」、「非推奨」、「削除済み」、「Python 3.7へのポーティング」、「ドキュメンテーション」を削除
* 最新版に合わせて項目の順序を変更

#変更内容
##リリースハイライト
新たな文法を導入した変更

* [PEP-563](https://www.python.org/dev/peps/pep-0563/) アノテーションの評価を遅らせる

過去互換性のない文法変更

* `async`と`await`は予約語になりました。

新たなライブラリモジュール

* [PEP-567](https://www.python.org/dev/peps/pep-0567/) コンテキスト変数
* [PEP-557](https://www.python.org/dev/peps/pep-0557/) データクラス
* importlib.resources

新たな組み込み機能

* [PEP-553](https://www.python.org/dev/peps/pep-0553/) 組み込みブレークポイント

Pythonデータモデルの改善

* [PEP-562](https://www.python.org/dev/peps/pep-0562/) モジュール属性へのアクセスをカスタマイズ
* [PEP-560](https://www.python.org/dev/peps/pep-0560/) `typing`モジュールとジェネリック型のコアサポート
* 辞書型オブジェクトが挿入順を保持する事が正式にPython言語の仕様として宣言された

標準ライブラリの特筆すべき改善

* `asyncio`モジュールは新機能の追加やユーザビリティ及び性能の改善が行われた
* `time`モジュールはナノ秒解像度の関数のサポートが追加された

CPython実装の改善

* 文字エンコードのデフォルトとしてASCIIを使わないようになった
  * [PEP 538](https://www.python.org/dev/peps/pep-0538/) Cロケールの抑制
  * [PEP 540](https://www.python.org/dev/peps/pep-0540/) 強制的なUTF-8実行時モード
* [PEP 552](https://www.python.org/dev/peps/pep-0552/) 確定的なpycファイル
* 新たな開発実行時モード
* [PEP 552](https://www.python.org/dev/peps/pep-0565/) 非推奨警告の取り扱い改善

C APIの改善
[PEP-539](https://www.python.org/dev/peps/pep-0539/) スレッド局所記憶にアクセスするための新たなC言語API

ドキュメントの改善

* [PEP-545](https://www.python.org/dev/peps/pep-0545/) Pythonドキュメントの翻訳プロセス
* 新たな翻訳ドキュメント：[日本語](https://docs.python.org/ja/)、[フランス語](https://docs.python.org/fr/)、[韓国語](https://docs.python.org/ko/)

このリリースでは多くの箇所で特筆すべき性能改善を行なっている。詳細は「最適化」を参照。

過去バージョンとの互換に影響を与えるような変更については「Python 3.7へのポーティング」を参照ください。

##新機能
### [PEP-563](https://www.python.org/dev/peps/pep-0563/) アノテーションの評価を遅らせる
[PEP-3107](https://www.python.org/dev/peps/pep-3107/)で提案され[PEP-0526](https://www.python.org/dev/peps/pep-0526/)で改善されたアノテーション機能により型ヒントを与えられるようになった。だがそれによって二つの少し目立つユーザビリティの問題が起こった。

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

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

これにより以下の前方参照の例も文法的に許容されるようになった(クラスCの`validate_b`というメソッドでその後に定義されているクラスBを参照している)。

```
class C:
    @classmethod
    def from_string(cls, source: str) -> C:
        ...

    def validate_b(self, obj: B) -> bool:
        ...

class B:
    ...
```

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

```
from __future__ import annotations
```

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


### [PEP-538](https://www.python.org/dev/peps/pep-0538/) 過去の遺物であるCロケールの抑制
Pythonインタプリターのコマンドラインインターフェースで、Cロケール（POSIXロケール）を設定していたとしても、強制的に`C.UTF-8`、`C.utf8`、`UTF-8`のどれかに変更して実行を行うというもの。これにより、ロケールを解釈するC拡張モジュール（readlineなど）はASCIIの代りにUTF-8をデフォルトエンコーディングとして動作する。この動作は新たに導入される`PYTHONCOERCECLOCALE`という環境変数によって制御が可能（0にすると以前のバージョンの動作に戻る）。また、これに伴い、`stdin`と`stdout`のデフォルトエラーハンドラーは`surrogateescape`になる。`stderr`はロケールに関わらず`backslashreplace`のまま。

### [PEP-540](https://www.python.org/dev/peps/pep-0540/) UTF-8モードの追加
UTF-8モードが追加された。このモードではLocaleは無視してUTF-8エンコーディングが用いられる。そして、標準入出力のエラー処理には `surrogateescape`が使用されます。このモードはPOSIX Locale以外ではデフォルトでオフになっているが、コマンドラインで　-X `utf8`を付けるか、PYTHONUTF8環境変数を設定することでオンにすることができる。


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

### [PEP-539](https://www.python.org/dev/peps/pep-0539/) スレッド局所記憶にアクセスするための新たなC言語API
一つのプロセス内のスレッドは通常アドレス空間を共有しているが、スレッド毎に独立した記憶領域が欲しい場合がある。その為に各種プラットフォームで用意されている仕組みが
[スレッド局所記憶(Thread local storage)](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%AC%E3%83%83%E3%83%89%E5%B1%80%E6%89%80%E8%A8%98%E6%86%B6)である。Pythonでは従来[Thread Local Storage(TLS) API ](https://docs.python.org/3.7/c-api/init.html#thread-local-storage-api)というAPIでこれにアクセスしていたが、Keyの値が整数であるという想定を置いていた。これは全てのプラットフォームで成り立つ想定ではないため、新たに[Thread Specific Storage (TSS) API](https://docs.python.org/3.7/c-api/init.html#thread-specific-storage-api)を定義し、これによってTLS APIを置き換えることとした。


### [PEP-562](https://www.python.org/dev/peps/pep-0562/) モジュール属性へのアクセスをカスタマイズ
モジュールレベルで`__getattr__()`を定義することができ、それによってモジュール属性へのアクセスをコントロールできるようになった。それにより、例えば非推奨の属性に対するアクセスが有った場合に警告メッセージをこれまでよりも容易に出せるようになった。

### [PEP-564](https://www.python.org/dev/peps/pep-0564/) ナノ秒の精度を持つ新たな時間関数
従来の時間関数のナノ秒精度を持つバージョンが追加された。

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

### [PEP-565](https://www.python.org/dev/peps/pep-0565/) \_\_main\_\_で非推奨の警告を出す

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

### [PEP-560](https://www.python.org/dev/peps/pep-0560/) `typing`モジュールとジェネリック型のコアサポート

当初、[PEP-484](https://www.python.org/dev/peps/pep-0484/)はCPythonのコアに変更を加えずに導入できるよう設計されていた。ところが最近になり、型ヒントや`typing`モジュールがコミュニティの中で広く使われるようになってきたので、この制限を取り払うこととした。このPEPで、`__class_getitem__()`と`__mro_entries__`という二つのメソッドを導入し、`typing`モジュールのほとんどの構成要素から使うようにした。結果として、型に関する様々な操作が最大7倍早くなり、ジェネリック型をメタクラスの衝突無しに利用したりできるようになった。またこれにより、長い間解決されずにいたバグのいくつかが修正された。

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

### [PEP-552](https://www.python.org/dev/peps/pep-0552/)ハッシュを利用したpycファイル
Pythonはバイトコードコンパイルした結果をpycファイルにキャッシュとして格納する。その際に、元ファイルの最終更新時刻とサイズをpycファイルのヘッダに記録しておき、再コンパイルが必要かどうかを判断するのに使っていた。これは効率的ではあるが欠点もある。ファイルシステムの時刻の解像度が荒かったりすると再コンパイルが必要なのにしなかったりして混乱をもたらす可能性がある。また、時刻をキャッシュファイルに記録するのでビルドの再現性の点で問題になったりもする。

[PEP-552](https://www.python.org/dev/peps/pep-0552/)では元ファイルのハッシュをpycファイルに記録出来るようにする拡張を提案している。通常の利用では引き続き時刻を元にした判断が行われハッシュをpycに記録することは無いが、ハッシュを利用したpycは`py_compile`や`compileall`などのモジュールで生成することができる。

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

### [PEP-545](https://www.python.org/dev/peps/pep-0545/) Pythonドキュメントの翻訳
PEP 545ではPythonドキュメントの翻訳プロセスに関して記述している。三つの翻訳が追加された。

* Japanese: https://docs.python.org/ja/
* French: https://docs.python.org/fr/
* Korean: https://docs.python.org/ko/

## その他の言語の変更

* 関数で256以上の引数をとれるようになった
* `bytes.fromhex()` と `bytearray.fromhex()` はスペースだけでなく、ASCIIの空白文字全てを無視するようになった。
* `str`、`bytes`、`bytearray`に新たに`isascii()`メソッドが追加され、文字列あるいはバイト列がASCII文字のみを含むか否かをテストできるようになった
* `from ... import ...`で`ImportError`になる時にモジュール名とモジュールのパスを表示するようになった。

```import_error.py
from os import unknown_func
```

```console: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'
```

```console: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)`と等価になった。
* スタックトレースの動的生成をより良くサポートするために、`types.TracebackType`はPythonコードからインスタンス化できるようになり、tracebacksの`tb_next`属性に書き込みできるようになった。
* `-m`オプションを使う時、`sys.path[0]`は空ディレクトリだったのが、実行ディレクトリのフルパスを返すようになった。
* 新たな`-X`オプションあるいは`PYTHONPROFILEIMPORTTIME`環境変数により各モジュールインポートのタイミングを表示できる。

## 新規モジュール
### contextvars
`contextvars`という新たなモジュールと新たなC言語APIによりコンテキスト変数のサポートが導入された。コンテキスト変数はスレッドローカル変数と概念的には似ているが、非同期のコードでも正しく動作する。

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

```
@dataclass
class Point:
    x: float
    y: float
    z: float = 0.0

p = Point(1.5, 2.5)
print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"
```

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

## 改善されたモジュール
### argparse
`parse_intermixed_args()`でオプションと位置引数を混合することができるようになった。

### asyncio

`asyncio`モジュールは多くの機能追加とユーザビリティ及び性能の改善が行われた。特筆すべき主な変更点は以下の通り。

* `asyncio.run`関数が追加され、同期コードから自動的にイベントループを作ったり消したりしながら、コルーティンを走らせることができるようになった。
* asyncioに`contextvars`モジュールのサポートが追加された。`loop.call_soon()`、`loop.call_soon_threadsafe()`、`loop.call_later()`、`loop.call_at()`、`Future.add_done_callback()`の各メッソドに*context*パラメータが追加され、`Tasks`クラスはそれらのコンテキストを自動的にトラックするようになった。詳細は[PEP-567](https://www.python.org/dev/peps/pep-0567/)参照。
* `asyncio.get_event_loop().create_task()`のショートカットとして`asyncio.create_task`関数が追加された。
* 新たに追加された`loop.start_tls()`を使うと、接続済のコネクションをTLSにアップグレードできる。
* 新たな`loop.sock_recv_into()`関数はデータをソケットから読み、直接与えられたバッファに書き込む。これによりデータのコピーの回数を減らすことができる。
* 新たな`asyncio.current_task`関数は、現在走っている`Task`インスタンスを返し、`asyncio.all_tasks`は与えられたループにある全ての`Task`のリストを返す。`Task.current_task()`と`Task.all_tasks()`メソッドは非推奨となる。
* 新たに`BufferedProtocol`クラスが導入され、これにより受信バッファを手動制御するようなストリーミングプロトコルを実装できるようになった。
* 新たな`asyncio.get_running_loop`関数は、現在実行中のループを返し、もし実行中のループが一つもない場合には`RuntimeError`例外を発生させる。これは、`asyncio.get_event_loop`が実行中のループがない場合に新たなループを作って返すのとは対照的である。
* `StreamWriter.wait_closed()`コルーチンメソッドは、そのストリームライターが閉じるまで待つ。`StreamWriter.is_closing()`メソッドはそのライターが閉じているかどうかを確認できる。
* `loop.sock_sendfile()`コルーチンメソッドは、可能な場合に`os.sendfile`を使ってファイルを送る。
* `Task.get_loop()`と`Future.get_loop()`メソッドはそのTaskやFutureが生成されたループインスタンスを返す。`Server.get_loop()`は同様のことを`asyncio.Server`オブジェクトに対して行う。
* `asyncio.Server`インスタンスがどのようにサービスを開始するかを制御できるようになった。以前はサーバーは生成された直後にサービスを開始していた。新たに導入された*start_serving*キーワード引数により`loop.create_server()`、`loop.create_unix_server()`と`Server.start_serving()`、`Server.serve_forever()`でサーバーのインスタンス生成と実際のサービス開始を切り分けることができるようになった。`Server.is_serving()`メソッドはサーバが稼働中の時には真を返す。`Server`クラスのオブジェクトは非同期コンテキストマネージャである。

```
srv = await loop.create_server(...)

async with srv:
    # some code

# At this point, srv is closed and no longer accepts new connections.
```

* `loop.call_later()`で返されるコールバックオブジェクトに新たに`when()`メソッドが追加され、絶対的なスケジュールされたコールバック時刻を返す。
* `loop.create_datagram_endpoint()`メソッドにUnixソケットのサポートが追加された
* `asyncio.open_connection`、`asyncio.start_server`、`loop.create_connection()`、`loop.create_server()`、`loop.create_accepted_socket()`とそれらのUnixソケット版は*ssl_handshake_timeout*キーワード引数を受け付けるようになった。
* `Handle.cancelled()`メソッドが追加され、コールバックがキャンセルされた時に真を返す。
* asyncioのソースコードが`async`/`await`を使って書き換えられた。
* `ReadTransport.is_reading()`メソッドが追加され、トランスポートの読み込み状態を確認できるようになった。加えて、`ReadTransport.resume_reading()`と`ReadTransport.pause_reading()`が冪等（複数回操作を行っても結果が同じ）になった。
* ソケットパスを受け付けるLoopメソッドはパス風オブジェクトをサポートするようになった。
* Linux上の`asyncio`のTCPソケットはデフォルトで`TCP_NODELAY`をつけて生成されるようになった。
* キャンセルされたタスクで起きた例外はログされなくなりました。
* `WindowsSelectorEventLoopPolicy`クラスと`WindowsProactorEventLoopPolicy`クラスの追加。

幾つかの`asyncio`APIは非推奨となった。

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

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

### collections
`collections.namedtuple()`がデフォルト値をサポートするようになった。

### compileall
`compileall.compile_dir`関数が*invalidation_mode* 引数を取るようになり、ハッシュでのpycファイル更新確認ができるようになった。この更新確認モードはコマンドラインで`--invalidation-mode`をつけることでも指定できる。

### concurrent.futures

`ProcessPoolExecutor`クラスと`ThreadPoolExecutor`クラスはコンスラクタ引数として*initializer*と*initargs*をサポートするようになった。

`ProcessPoolExecutor`クラスは、新たに追加された*mp_context*引数でマルチプロセッシングコンテキストを取ることができる。

### contextlib

`ExitStack`クラスよりもより簡単で高速に動作するno-opコンテキストマネージャとして、`nullcontext`関数が追加された

`asynccontextmanager`、`AbstractAsyncContextManager`、`AsyncExitStack`らが、非同期版の関数、クラスとして追加された。

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

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

### datetime

`fromisoformat()`メソッドが追加され、`isoformat()`メソッドから出力された文字列から`datetime`オブジェクトを生成することができるようになった。

`tzinfo`クラスは分単位以下のオフセットをサポートするようになった。

### dbm
`dbm.dumb`はread-onlyファイルを読めるようになり変更されていない時にはindexファイルを書かないようになった。

### decimal

`decimal`モジュールはコンテキス変数を利用するようになり、十進数コンテキストを保持するようになった。

### dis
`dis()`関数でネストしたコードオブジェクトの逆アセンブルができるようになった。最大ネスト数は新たに追加された*depth*パラメータでコントロールできる。

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

### enum
`Enum`クラスは`_ignore_`クラスプロパティを理解するようになり、列挙型のメンバにしたくないプロパティの名前を指定できるようになった。

Python 3.8ではEnum型でないオブジェクトでEnum型の存在確認(in演算)をすると`TypeError`例外を発生するようになる（例えば`1 in Color`など）。同様に、`Flag`クラスのメンバの存在確認でも`TypeError`例外を発生するようになる（例えば`1 in Perm.RW`など）。今のところはこれらの操作では`False`を返し非推奨の警告をだす。

### functools
`functools.singledispatch`は型アノテーションを使った実装の登録をサポートするようになった。

### gc
新たに追加された`gc.freeze`により、ガベージコレクタで追跡されている全てのオブジェクトをフリーズし、その後の回収対象から外すことができるようになった。これを呼ぶことでPOSIXの`fork()`をガベージコレクションの copy-on-writeに優しく、回収のスピードをあげることができる。`gc.unfreeze`はこの反対の操作をおこなう。また、`gc.get_freeze_count`でフリーズされているオブジェクトの数を知ることができる。

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

### http.client
`HTTPConnection`と`HTTPSConnection`でブロックサイズが変更可能になり、アップロードスループットを改善できる。

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

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

新たな`ThreadingHTTPServer`クラスは`ThreadingMixin`を使ってスレッドでリクエストを処理する。これは、`http.server`を`-m`オプションで起動させた時の動作である。

### idlelibとIDLE
自動補完の複数の修正。

モジュールブラウザはネストした関数やクラスを表示できるようになった。

設定画面が部分的に書き換えられ見た目と機能が向上した。

フォントのサンプルにラテン系以外の文字も追加され、特定のフォントを選んだ時の効果をよりよく見ることができるようになった。またサンプルに別の文字を含むように編集可能になった。

以前は拡張として実装されてたIDLEの機能が標準機能として再実装された。それらの設定は拡張タブから他の設定タブに移動された。

エディタのコードコンテキストオプションが改修された。

Windows上で新たなAPI呼び出しがされ、tkがDPIにスケールすることをOSに伝えている。これにより、Windows8.1+か10の上でテキストや線の描画がより鮮明になる可能性がある。

上記の変更は 3.6のメンテナンスリリースでもバックポートされている。


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

`importlib.reload`関数は、対象のモジュールがSpecを欠いていたら`ModuleNotFoundError`例外をあげるようになった。

`importlib.find_spec`関数は、指定された親モジュールがパッケージじゃない（例えば`__path__`属性を欠いているなど）時に、`AttributeError`ではなく`ModuleNotFoundError`例外をあげるようになった。

`importlib.source_hash`関数は、渡されたソースコードのハッシュを計算し、ハッシュを利用したpycファイルはこの値を埋め込む。

### io
`TextIOWrapper.reconfigure()`メソッドにより、テキストストリームを新たな設定で再構成できる。

### ipaddress
`IPv6Network`および`IPv4Network`クラスに`subnet_of()`と`supernet_of()`の二つのメソッドが追加され、ネットワークの包含関係を確認できる。

### itertools
`itertools.islice`関数は、start, stop, slice引数に整数風オブジェクトを取れるようになった。

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

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

### logging
`Logger`クラスのインスタンスはピクル化できるようになった。

`StreamHandler.setStream()`メソッドが追加され、ハンドラを作成後にロガーストリームを変更することができるようになった。

`logging.config.fileConfig`に渡すコンフィグレーションファイルの中でハンドラ作成時のキーワード引数を指定できるようになった。

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

### mimetypes
.bmpファイルのMIMEタイプを`'image/x-ms-bmp'`から`'image/bmp'`に変更した。

### msilib
`Database.Close()`メソッドが新たに提供され、`MSI`データベースを閉じることができる。

### multiprocessing
新たな`Process.close()`メソッドは、明示的にプロセスオブジェクトを閉じて、それに関連づけられた全てのリソースを解放する。そのプロセスがまだ稼働している時には`ValueError`例外をあげる。

新たな`Process.kill()`メソッドは、Unix上で`SIGKILL`シグナルを用いてそのプロセスを停止させる。

`Process`クラスで作成されたデーモン化されていないスレッドがある場合、その完了を待ってプロセスは終了する。

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

試してみよう。

```scandir_fd.py
import os
fd = os.open('.', os.O_DIRECTORY)
for f in os.scandir(fd):
  print(f)
```

```console: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
```

```console:Python3.7
$ python3.7 scandir_fd.py
<DirEntry 'scandir_fd.py'>
<DirEntry 'import_error.py'>
<DirEntry '.python-version'>
```

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

`register_at_fork`関数が導入され、プロセスがフォークするときに呼ばれるPythonコールバックを設定できるようになった。

`os.preadv`関数(`os.readv`と`os.pread`の機能を一体化)および`os.pwritev`関数(`os.writev`と`os.pwrite`の機能を一体化)を追加した。

`os.makedirs`のmode引数は新たに作成される中間レベルディレクトリのファイルパーミッションビットに影響しなくなった。

`os.dup2`は新たに作成されたファイルディスクリプタを返すようになった。以前は常に`None`を返していた。

`os.stat`で返される構造体は、Slarisおよびその派生OSで`stat_result.st_fstype`属性を返すようになった。

### pathlib
`Path.is_mount()`メソッドがPOSIXシステムで追加され、指定したパスがマウントポイントかどうかを判定することができるようになった。

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

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

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

### pydoc
pydocサーバーは、コマンドライン引数の`-n`で指定された任意のホスト名にバインドできるようになった。

### queue
新たに`SimpleQueue`クラスが提供され、バインドされていないFIFOキューを生成できるようになった。

### re
`re.ASCII`、`re.LOCALE`、`re.UNICODE`がグループのスコープとして設定可能になった。

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

`re.LOCALE`フラグ付きでコンパイルされた正規表現はコンパイル時のロカールに依存しなくなった。ロカールの設定はそのコンパイルされた正規表現が使われる際に適用される。

正規表現が将来的に意味が変わる文字セット（例えば、ネストしたセットやセット操作）を使っている場合、`FutureWarning`例外をあげるようになった。

コンパイルされた正規表現やマッチオブジェクトが`copy.copy`や`copy.deepcopy`でコピーできるようになった。

### signal
`signal.set_wakeup_fd`に*warn_on_full_buffer*引数が追加され、wakeupファイルディスクリプタがバッファオーバーフローした時に標準エラーに警告メッセージを出力するかどうかを指定できるようになった。

### socket
`socket.getblocking()`メソッドが追加され、ソケットがブロッキングモードになっているか否かを確認できるようになった。

`socket.close`関数が追加され、渡されたソケットファイルディスクリプタを閉じることができるようになった。様々なプラットフォームのより良い互換性のため、今後は`os.close`ではなくこちらを使うべし。

`socket`モジュールに`socket.TCP_CONGESTION`(Linux 2.6.13)、`socket.TCP_USER_TIMEOUT` (Linux 2.6.37)、`socket.TCP_NOTSENT_LOWAT` (Linux 3.12)という定数が追加された。

仮想マシンとそのホスト間の通信のために`socket.AF_VSOCK`ソケットのサポートが追加された。

デフォルト動作として、ソケットはそのファイルディスクリプタからファミリー、タイプ、プロトコルを自動検知するようになった。

### socketserver
`socketserver.ThreadingMixIn.server_close`メソッドは非デーモン化されたスレッドの完了を待つようになった。`socketserver.ForkingMixIn.server_close`メソッドは全ての子プロセスの完了を待つようになった。

新たなクラス属性として`socketserver.ForkingMixIn.block_on_close`が`socketserver.ForkingMixIn`クラスと`socketserver.ThreadingMixIn`クラスに追加された。このクラス属性を`False`にすることで3.7より前の動作に戻すことができる。

### sqlite3
利用しているSQLiteのライブラリがバージョン3.6.11以上の場合、`sqlite3.Connection`クラスに`Connection.backup`メソッドが追加される。

`sqlite3.connect`の*database*引数はパス風オブジェクトを受け付けるようになった。

### 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のサポートを追加した。

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

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

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

### subprocess
`subprocess.run`関数は、新たなキーワード引数*capture_output*を取るようになり、これが真の時は標準出力と標準エラーをキャプチャするようになる。これは、*stdout*と*stderr*引数に`subprocess.PIPE`を渡すのと同等の効果がある。

`subprocess.run`関数と`subprocess.Popen`クラスのコンストラクタは、*universal_newlines*のエイリアスとして*text*キーワード引数を取るようになった。

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

`subprocess.call`、`subprocess.run`や`Popen`クラスのコンテキストマネージャ内で、より「上品に」`KeyboardInterrupt`例外を処理するようになった。つまり、例外処理を始める前に、子プロセスが終了するために少しの時間待つ。

### sys
`sys.breakpointhook`フック関数が追加され、組み込み関数の`breakpoint`から呼ばれることになった。

Android上で、`sys.getandroidapilevel`はビルド時のAndroidのAPIバージョンを返す。

コルーチンのオリジン追跡深度は新たに追加された`sys.set_coroutine_origin_tracking_depth`関数で設定でき、それを`sys.get_coroutine_origin_tracking_depth`関数で取得できる。`asyncio`モジュールは、非推奨となった`sys.set_coroutine_wrapper`の代わりにこれらの新しいAPIを使うようになった。

### time
[PEP-564](https://www.python.org/dev/peps/pep-0564/) によりナノ秒の精度を持つ新たな時間関数が追加された。

* 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時間の測定ができるようになった。

新たに追加された`time.pthread_getcpuclockid`関数が、スレッド特有のCPU時間クロックのIDを返すようになった。

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

### tracemalloc

`tracemalloc.Traceback`クラスは通常のトレースバックのように動作し、フレームは古い方から新しい方へとソートされる。`Traceback.format()`メソッドは負の値を*limit*パラメータで取れるようになり、古い方から*limit*の絶対値分だけにサイズを切り詰める。前の動作をさせたい場合は新たに追加された*most_recent_first*を引数を使うと良い。

###types

`WrapperDescriptorType`クラス、`MethodWrapperType`クラス、`MethodDescriptorType`クラス、`ClassMethodDescriptorType`クラスが追加された。

`types.resolve_bases`関数が追加され、PEP-560で示されているようにMRO(Method Resolution Orders)エントリーを動的に解決する。

### unicodedata
unicodedataの内部データベースが[Unicode 11](http://www.unicode.org/versions/Unicode11.0.0/)を利用するようにアップグレードされた。

### unittest
新たなコマンドライン・オプション`-k`が追加され、走らせるテストを部分文字列あるいはUnixのシェル風パターンで指定することができるようになった。例えば、`python -m unittest -k foo`は`foo_tests.SomeTest.test_something`や`bar_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))
```

```console:Python3.6
$ python3.6 sentinel_test.py
a == a2:  False
a == a3:  False
```

```console:Python3.7
$ python sentinel_test.py
a == a2:  True
a == a3:  True
```

また、新たな関数`mock.seal`が導入され、それが適用されたモックオブジェクトでは新たな属性の読み書きができなくなる。モックオブジェクトが他のモックを属性として持っていたらそれらにもこのSealは再帰的に適用される。


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

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

### uuid

新たに追加された`UUID.is_safe`属性により、そのプラットフォームのUUID生成方法がマルチプロセス対応しているかどうかを知ることができるようになった。

`uuid.getnode`はローカルアドレスではなくグローバルアドレスを優先的に用いる。これにより、`uuid.uuid1`で生成されるUUIDのグローバルな単一性をよりよく保証できる。仮にローカルアドレスしかない場合は最初に見つかったモノを返す。

### warnings

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

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

単一ファイルスクリプトや対話プロンプトの時はデフォルトで非推奨警告が表示される。

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

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

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

### zipfile

`ZipFile`クラスは*compresslevel*パラメータを受け付け、圧縮レベルをコントロールできるようになった。

`ZipFile`で生成されたアーカイブに含まれるサブディレクトリはアルファベット順に格納されるようになった。