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 専用コーデックとして追加。collections
ChainMap
が追加。Counter
に+=
,-=
, etc. が追加。
io
:open()
に排他フラグx
が追加。既存のファイルと同じ名前のものを開こうとすると例外FileExistsError
を送出する。itertools.accumulate()
が二項関数を受け付けるようになった。math.log2()
が追加。なんとmath.log(x, 2)
より正確であることが期待できる。mmap.read()
を引数なしで呼び出し、バイト列を受け取ることができる。multiprocessing
周り。要研究。pdb
タブ補完がより便利になった。コマンド名だけでなく、引数も補完する。sys.implementation
追加。sys.version_info
をメンバーとして含む。time
perf_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 の複数のバージョンが環境にある場合の起動が柔軟にできるようだ。