What’s New In Python 3.3 ノート¶
What’s New In Python 3.3 を読んで、個人的に関心のある項目に注釈を付けていく。
組み込み機能¶
bytesとbytearrayのメソッドでバイト値を引数にするようなものについて、 0 から 255 の整数を入力することが許されるようになった。ROM 解析コードを書くのに明らかに便利。
listとbytearrayにcopy(),clear()が追加。copy()はいわゆる浅いコピーを実現する。clear()が今までなかったのは驚き。
OSError例外階層が変更され、単純化された。OSError +-- BlockingIOError +-- ChildProcessError +-- ConnectionError | +-- BrokenPipeError | +-- ConnectionAbortedError | +-- ConnectionRefusedError | +-- ConnectionResetError +-- FileExistsError +-- FileNotFoundError +-- InterruptedError +-- IsADirectoryError +-- NotADirectoryError +-- PermissionError +-- ProcessLookupError +-- TimeoutError
IOErrorやWindowsErrorがOSErrorに吸収されたと考えてよい。In [29]: IOError Out[29]: OSError In [30]: WindowsError Out[30]: OSError
例えば
FileExistsErrorやFileNotFoundErrorといったサブクラスが新規追加。これらによりIOError.errnoを調べて処理を分岐するようなコードを書くのをやめられる。
クラスと関数に
__qualname__という属性が追加した。その要素を包含する名前空間のパスが見える。print()にflushキーワード引数が追加。想像通りの振る舞いをする。
文法仕様¶
yield from式の追加。例外処理を考慮に入れなければ
yield from Xはfor i in X: yield iと同値。この構文のおかげで generator を小分けにできる。
def generator(args1, args2): yield from subgenerator1(args1) yield from subgenerator2(args2) g = generator(x, y)
raise X from none式の追加。except節で本来の例外を別のものに変換するときに、本来のエラーメッセージを潰すことができる。C++ の感覚だと不思議だ。Unicode リテラル値のためのプレフィックスが復活した。
raw bytes リテラルとして
br"..."だけでなくrb"..."とも書けるようになった。rbしか使ったことがない。ちなみに生バイトリテラルはバイトデータの正規表現を指定するのに使える。
新規モジュール¶
unittest.mock
変更モジュール¶
abc@abstractproperty,@abstractclassmethod,@abstractstaticmethodが軒並み非推奨。@abstractmethodに対応する組み込み関数を渡すように。この場合
@abstractmethodのほうを内側に置く。class SomeClass(metaclass=ABCMeta): @property @abstractmethod def some_abstract_property(self): return ... @classmethod @abstractmethod def some_abstract_classmethod(cls, args): ... @staticmethod @abstractmethod def some_static_method(args): ...
ABCMeta.register()が戻り値としてサブクラスを返すようになった。このことでクラスに対するデコレーターとしても使えるようになった。
codecsにcp65001が Windows 専用コーデックとして追加。collectionsChainMapが追加。Counterに+=,-=, etc. が追加。
io:open()に排他フラグxが追加。既存のファイルと同じ名前のものを開こうとすると例外FileExistsErrorを送出する。itertools.accumulate()が二項関数を受け付けるようになった。math.log2()が追加。なんとmath.log(x, 2)より正確であることが期待できる。mmap.read()を引数なしで呼び出し、バイト列を受け取ることができる。multiprocessing周り。要研究。pdbタブ補完がより便利になった。コマンド名だけでなく、引数も補完する。sys.implementation追加。sys.version_infoをメンバーとして含む。timeperf_counter()やprocess_time()などの関数が追加。clock_系関数追加。UNIX のみ。sleep()に負の値を渡すとValueErrorを送出するように変更。clock()はプラットフォーム依存。これではなくperf_counter()やprocess_time()を使う。
In [16]: import time In [17]: time.get_clock_info('clock') Out[17]: namespace(adjustable=False, implementation='QueryPerformanceCounter()', monotonic=True, resolution=9.3302207716839e-07) In [19]: time.get_clock_info('perf_counter') Out[19]: namespace(adjustable=False, implementation='QueryPerformanceCounter()', monotonic=True, resolution=9.3302207716839e-07) In [20]: time.get_clock_info('process_time') Out[20]: namespace(adjustable=False, implementation='GetProcessTimes()', monotonic=True, resolution=1e-07) In [22]: time.perf_counter() Out[22]: 119.36619157182497 In [23]: time.perf_counter() Out[23]: 124.75250189869993 In [24]: time.process_time() Out[24]: 10.09375 In [25]: time.process_time() Out[25]: 10.140625
webbrowserが Google Chrome をサポート。xml.etree.ElementTreeはこの名前で C 実装版が採用されるようになった。
その他¶
Windows 版には py というスクリプトランチャーが配備されるようで、 Python の複数のバージョンが環境にある場合の起動が柔軟にできるようだ。