Edited at

Python3.5の新機能

More than 1 year has passed since last update.


はじめに

開発ロードマップ(PEP-478)によると正式リリースが9/13(おそらくUS時間)に予定されているPython 3.5。追加のリリース候補(rc4)が9/9にリリースされたこともあり、多少遅れる可能性もあるが、おそらくは一週間以内にでることであろう。ということで、Python3.5の変更点の日本語まとめ + 一言コメントをしてみた。元ネタはこちらの冒頭にある "Summary - Release Highlights"。

なお、Python3.5を試すには、最新のリリース候補をここからダウンロードすればよい。あるいはpyenvを使っている人はpyenv installで簡単に導入できるが、pyenvの最新版v20150901ではrc2までしかサポートされていないのでそれで我慢するか、pyenvをHEADから取ってくる必要がある。homebrewを使っている場合はこんな感じ。

brew uninstall pyenv # すでにインストールされている場合

brew install pyenv --HEAD
pyenv install 3.5.0rc4


2015/09/14追記

予定通り、3.5.0がリリースされました。正直、こんなに早く来ると思っていなかった..

pyenvも早速アップデートされて 20150913になり、3.5.0が正式サポートされました。Homebrewにもすでに上がっている。みんな仕事が早い! なので、お試しされたい方はこれで大丈夫になりました。

brew install pyenv # 若しくはインストール済みの人は brew upgrade

pyenv install 3.5.0


Python 3.5 リリースハイライト


新たな文法による機能 (New syntax features)


行列乗算オペレーター

PEP-465で提案されている、行列の乗算をa@bという形で書けるようにするという仕様追加。不思議なのは標準ライブラリではこれを使う実装は提供されず、仕様だけ。代わりにnumpyなどの幾つかの外部ライブラリが対応を表明している。


asyncとawaitによるコールーチン

PEP-492で提案されている、コールーチンを定義し利用するための仕様追加。これまでもGeneratorを使ってコールーチンを作成することは出来たが、よりわかりやすくするためにasyncとawaitというキーワードを導入して仕様拡張を行ったとのこと。


アンパッキングのさらなる一般化

PEP-448で提案されている、***を使った値の展開の機能拡張。print(*[1], *[2], 3)というように関数の引数として複数回使ったり、[*range(4), 4]のようにタプルやリスト、ディクショナリの中でも使えるようになる。


新たなライブラリモジュール (New library modules)


zipapp

Pythonはzipで固められたpythonコードを実行する機能を持っている。しかもv2.6の頃から! せっかくの機能なのに誰にも知られずに使われていない(私も知らなかった!)のはもったいないのでその機能を使いやすくしよう、という提案がPEP-441でされていて出来たツールがzipapp。Zipで固めたPythonコードを "Python Zip Application"と呼ぶことにして、それを作成するための機能などを提供する。


新たなビルトインの機能 (New built-in features)


BytesやBytearrayでの%によるフォーマッティング

これまでも、"%04x" % 10みたいな事はできたが、結果はstr型になる。それをb"%04x" % 10みたいな形でbytes型にもできるようにするという機能拡張。


Bytes、Bytearray、Memoryviewでのhexメソッドサポート

b'\xf0\x9f\x90\x8d'.hex()という様なことができるようになる。


memoryviewでtuple indexing

多次元の配列(行列)の要素にアクセスするのにtupleでindexingできるようになるみたい。


Generatorのgi_yieldfrom属性追加

これは必要性が今ひとつわかりませんでした...


新しい例外 RecursionError

RuntimeErrorの一種で、再帰の最大数を超えると発生する。


新しい例外 StopAsyncIteration

async for で作られた非同期Iterableで繰り返し終了時に上げる例外。


CPython実装


sys.stdin/sys.stdoutのエラーハンドラー変更

LC_TYPEがPOSIX locale (C locale)の場合に、sys.stdinとsys.stdoutはstrictエラーハンドラーではなく、surrogateescapeエラーハンドラーを使うようになる。


.pyoの廃止

Pythonを-Oあるいは-OOオプション付きで実行すると、最適化されたバイトコンパイル結果が.pycではなく.pyoファイルに格納されていた。Python 3.5からはそれを廃止し.pycファイルに格納することとし、最適化レベルはファイル名の中に記す(例えば xxx.cpython-35.opt-1.pycのように)(PEP-488)


エクステンションのマルチフェーズ初期化

これまでビルトインモジュールやエクステンションは生成と初期化を一気に行っていた。これを他のモジュール同様に、生成を全てのモジュールに対して最初に行い、その後初期化コードの実行という形に変更する。(PEP-489)


大幅に改善されたライブラリモジュール


OrderedDictのC実装化

collections.OrderedDictがCで再実装され、4倍から100倍速くなった!


tmpfileの改善

これまでstr型でしか渡せなかった引数(prefixの指定など)で、bytes型も使えるようになる。また、Noneを指定することもできるようになる。


sslモジュールの改善

Memory BIOサポートの追加。この変更により、SSLプロトコルの処理を実際のSocket I/O処理から切り離すことができる。


tracebackモジュールの改善

より軽量な TracebackException, StackSummaryおよびFrameSummaryクラスを追加


lru_cacheの改善

関数呼び出しの結果をキャッシュするデコレータとしてfunctools.lru_cacheが提供されていたが、これがC言語で再実装された。


セキュリティの改善


SSLv3廃止

ssl.SSLContextを使って利用可能にできるが、標準ライブラリからは全撤廃。この変更はv3.4およびv2.7にもバックポート済み。これはPOODLE攻撃と言われたSSLv3の脆弱性問題を回避するための処置でしょう。


Cookie処理の改善

インジェクション攻撃防止のため、Cookieのパーシングをより厳密に。


Windowsでの改善


MSIに代る新たなインストーラを導入

小さいインストーラで必要なファイルを適宜インストール時にダウンロードしてくるWeb Installerと標準のコンポーネントを全て含んでいる Offline installerの二種類を用意。それぞれ32bit版と64bit版がある。


MSVC++ 14.0の使用

Windows用Python 3.5はMSVC++ 14.0でビルドされていて、エクステンションもこれでコンパイルする必要あり。


最後に

上記で紹介したもの以外にもWhat’s New In Python 3.5にはいろいろと変更点が書かれている。面白そうなものや使えそうなものがあれば是非取り上げてみたい。