Python3.5の新機能

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

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

```shell
brew uninstall pyenv # すでにインストールされている場合
brew install pyenv --HEAD
pyenv install 3.5.0rc4
```

##### 2015/09/14追記
予定通り、[3.5.0がリリースされました](http://blog.python.org/2015/09/python-350-has-been-released.html)。正直、こんなに早く来ると思っていなかった..

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

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


## Python 3.5 リリースハイライト
### 新たな文法による機能 (New syntax features)

#### 行列乗算オペレーター

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


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

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

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

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

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

Pythonはzipで固められたpythonコードを実行する機能を持っている。しかもv2.6の頃から！　せっかくの機能なのに誰にも知られずに使われていない(私も知らなかった！)のはもったいないのでその機能を使いやすくしよう、という提案が[PEP-441](https://www.python.org/dev/peps/pep-0441/)でされていて出来たツールが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](https://www.python.org/dev/peps/pep-0488/))

#### エクステンションのマルチフェーズ初期化
これまでビルトインモジュールやエクステンションは生成と初期化を一気に行っていた。これを他のモジュール同様に、生成を全てのモジュールに対して最初に行い、その後初期化コードの実行という形に変更する。([PEP-489](https://www.python.org/dev/peps/pep-0489/))

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

#### 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攻撃](https://ja.wikipedia.org/wiki/Transport_Layer_Security#POODLE.E6.94.BB.E6.92.83)と言われた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](https://docs.python.org/3.5/whatsnew/3.5.html)にはいろいろと変更点が書かれている。面白そうなものや使えそうなものがあれば是非取り上げてみたい。