What’s New In Python 3.5 ノート¶
What’s New In Python 3.5 を読んで、個人的に関心のある項目に注釈を付けていく。
新規機能¶
コルーチン関数など。
async def
,await
,async with
,async for
構文が追加された。行列乗算演算子
@
が追加。NumPy 利用者がうれしい。np.array
の積には、同じ添字である要素同士の積をとるものと、行列同士の積の二つが考えられることに注意。演算子@
を後者のために新設したと述べている。
関数呼び出しにおける unpacking が複数の引数で行えるようになった。この系として、次のようなこともできる:
In [159]: *range(10), Out[159]: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
新規モジュール¶
興味をそそるものがないので省略する。
変更モジュール¶
argparse
:ArgumentParser
にallow_abbrev
オプションが追加。長い名前のオプションを省略指定することを認めるかどうか。asyncio
3.5 からは
@asyncio.coroutine def
をasync def
と書ける。そこではyield from
をawait
としか書けない。await X
の書式のX
は丸括弧は要ると要らない場合がある。
JoinableQueue
というクラスがかつてあったが、これはasyncio.Queue
に取って代わられた。
collections
OrderedDict
のビューがreserved()
に対応した。deque
にいくつかのメソッド、演算子が追加されたことにより、シーケンスとしての操作性がlist
程度に向上した。
concurrent.futures
:ThreadPoolExecutor
のmax_workers
引数が明示的な指定を必要としなくなり、そのときは CPU の個数に基づいた値が設定される。configparser
:ConfigParser
にconverter
引数が追加された。これは構成項目の文字列の解析をする関数のdict
を指定するために利用する。contextlib
:redirect_stderr()
追加。redirect_stdout()
は既に提供済み。csv
:writerows()
が iterator 一般を入力として受け取れるようになった。In [162]: import csv, sys In [163]: writer = csv.writer(sys.stdout) In [169]: writer.writerow(range(10)) 0,1,2,3,4,5,6,7,8,9
enum
:Enum
が引数start
を追加。最初の列挙項目に対応する整数値を指定するのに用いる。In [175]: from enum import Enum In [176]: Dragon = Enum('Dragon', 'White Green Red', start=10000); Dragon Out[176]: <enum 'Dragon'> In [177]: Dragon.White Out[177]: <Dragon.White: 10000> In [178]: Dragon.Green Out[178]: <Dragon.Green: 10001> In [179]: Dragon.Red Out[179]: <Dragon.Red: 10002>
glob
: 関数glob
とiglob
がサブディレクトリーの再帰的検索を実装した。パターン文字列中に**
を指定することで実現する。例えばbin
ディレクトリーおよびそのすべてのサブディレクトリーにある*.py
ファイルを反復するにはglob('bin/**/*.py', recursive=True)
とするとよい。heapq
:merge()
内の要素比較のためのkey
引数が追加。json
tool
CUI が入力 JSON オブジェクトのキーの順番を維持するようになった。デコーダーの送出する例外が
ValueError
からJSONDecodeError
に変更となった。
logging
: すべてのログ出力関数がexc_info
引数を追加した。例外ハンドル時に捕捉した例外オブジェクトを引数として入力するのが自然な使い方だ。math
inf
,nan
が追加。isclose()
が追加。浮動小数点数同士を比較する関数。NumPy のそれの簡易版か。In [211]: from math import isclose In [212]: 1.1 + 2.2 == 3.3 Out[212]: False In [213]: isclose(1.1 + 2.2, 3.3) Out[213]: True
gcd()
が追加。引数に 0 を渡したときの戻り値が 0 になることに注意したい。
operator
:matmul
,imatmul
が追加。行列乗算演算子に対応する。os
scandir()
関数が追加。ファイルタイプや属性情報も必要とする状況ではlistdir()
関数を使うよりも効率的。path.commonpath()
関数が追加。指定した複数のファイルパスに関する最長共通部分ファイルパスを求める。
pathlib
Path.samefile()
は二つのファイルパスが等価かどうかを返す。Path.mkdir()
に引数exists_ok
が追加。UNIX の mkdir -p に相当する。Path.expanduser()
が追加。~
をユーザー名に置換する。Path.home()
が追加。静的メソッドだ。
re
固定長のグループに対する参照と条件付き参照が後読み宣言の中でも指定できるようになった。
re.compile(r'(a|b).(?<=\1)c')
最後の一文字は
ac
かbc
の形のc
にしかマッチしないという意味だ。正規表現パターン中のキャプチャーグループ数の上限が撤廃された。
sub()
,subs()
でマッチしないグループは例外を送出するのではなく、空文字列で置換されるようになった。Python 以外の正規表現エンジンは、このような場合は空文字列で置換するのが普通だ。なので、この機能変更の意図は理解できる。
error
オブジェクトの属性が増えた。正規表現のどこがおかしいのかを検討するのに役立つ。
subprocess
:run()
追加。IPython の %run と同じような機能だ。
非推奨¶
async
,await
が予約語になる予定があるので、識別子として使わない。StopIteration
を generator 内で送出すること。 Python 3.7 以降でRuntimeError
になる。
削除¶
pyo ファイル廃止
変更点¶
re.split()
に空文字列にマッチするパターンを渡すと警告。str.startswith()
,str.endswith()
に変なモノを渡したときにTrue
を返していたが、そうではなくなった。