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オプションが追加。長い名前のオプションを省略指定することを認めるかどうか。asyncio3.5 からは
@asyncio.coroutine defをasync defと書ける。そこではyield fromをawaitとしか書けない。await Xの書式のXは丸括弧は要ると要らない場合がある。
JoinableQueueというクラスがかつてあったが、これはasyncio.Queueに取って代わられた。
collectionsOrderedDictのビューが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引数が追加。jsontoolCUI が入力 JSON オブジェクトのキーの順番を維持するようになった。デコーダーの送出する例外が
ValueErrorからJSONDecodeErrorに変更となった。
logging: すべてのログ出力関数がexc_info引数を追加した。例外ハンドル時に捕捉した例外オブジェクトを引数として入力するのが自然な使い方だ。mathinf,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が追加。行列乗算演算子に対応する。osscandir()関数が追加。ファイルタイプや属性情報も必要とする状況ではlistdir()関数を使うよりも効率的。path.commonpath()関数が追加。指定した複数のファイルパスに関する最長共通部分ファイルパスを求める。
pathlibPath.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を返していたが、そうではなくなった。