はじめに
開発ロードマップ(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にはいろいろと変更点が書かれている。面白そうなものや使えそうなものがあれば是非取り上げてみたい。