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: ArgumentParserallow_abbrev オプションが追加。長い名前のオプションを省略指定することを認めるかどうか。

  • asyncio

    • 3.5 からは @asyncio.coroutine defasync def と書ける。そこでは yield fromawait としか書けない。

      • await X の書式の X は丸括弧は要ると要らない場合がある。

    • JoinableQueue というクラスがかつてあったが、これは asyncio.Queue に取って代わられた。

  • collections

    • OrderedDict のビューが reserved() に対応した。

    • deque にいくつかのメソッド、演算子が追加されたことにより、シーケンスとしての操作性が list 程度に向上した。

  • concurrent.futures: ThreadPoolExecutormax_workers 引数が明示的な指定を必要としなくなり、そのときは CPU の個数に基づいた値が設定される。

  • configparser: ConfigParserconverter 引数が追加された。これは構成項目の文字列の解析をする関数の 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: 関数 globiglob がサブディレクトリーの再帰的検索を実装した。パターン文字列中に ** を指定することで実現する。例えば 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')
      

      最後の一文字は acbc の形の 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 を返していたが、そうではなくなった。