魂の生命の領域

AWS とか Python とか本読んだ感想とか哲学とか書きます

Python 3.9 の beta 版がきたみたいだ

概要

Python 3.9 の beta 版がきたらしい

docs.python.org

本当は 8/4 に半分ぐらい書いたのですが、寝落ちしてしまい翌朝になったらなんか覚めてしまい書き上げるのが今になってしまいました。まぁ需要ないから誰も困りませんがね。

何が変わったのか

あんまりマニアじゃないので上から目立つところだけ斜め読みした程度ですが、 dict 型に対して新しい書き方が増えたり、型ヒントのときに使うクラスが組み込みになったりとか、そういうところは読み取れました。

以降、個人的に理解できそうでなおかつ興味が沸いたところだけちょっと試してみます。

遊ぶ

pyenv で入れる(のが無難でしょう)

$ pyenv install 3.9.0b5

dict のやつ

| で dict の merge ができるようになり、 |= で dict の update ができるようになったみたいです。

詳細はこちらにあります。

www.python.org

楽しそうですね。 | の場合は新しくオブジェクトを生成し、 |= の場合は in place でオブジェクトを置き換えます。

| はこんな感じです。

>>> d1 = {'a1': 'b1'}
>>> d2 = {'a2': 'b2'}
>>> d3 = d1 | d2
>>> d3
{'a1': 'b1', 'a2': 'b2'}

このように参照渡しではなくコピーを作成しているようで、 d1 側を書き換えてもマージした方は変化しません。

>>> d1['a1'] = 'B1'
>>> d3
{'a1': 'b1', 'a2': 'b2'}

対応する既存の書き方としては {**d1, **d2} です。この書き方も割とスタイリッシュなというか Python やってる感があって良いですが、 * を4つも書かないといけないので | の方が明らかに楽ですね。

dict 型でキーの重複はできない( dict1[key1] が一意に定まらないといけないですよね)ので、合体させた dict からは自動的に重複が取り除かれます。

>>> d1 = {'a1': 'b1', 'a2': 'b2'}
>>> d2 = {'a2': 'b2', 'a3': 'b3'}
>>> d1 | d2
{'a1': 'b1', 'a2': 'b2', 'a3': 'b3'}

同じキーで値が違う dict をマージさせるとどうなるんでしょうか、試してみます。 同じ a1 というキーに対して、それぞれ対応する値が b1b2 であるような dict 型変数 d1d2 をマージさせます。

>>> d1 = {'a1': 'b1'}
>>> d2 = {'a1': 'b2'}

こうなります。

>>> d3 = d1 | d2
>>> d3
{'a1': 'b2'}

逆にすると、こうなります。

>>> d4 = d2 | d1
>>> d4
{'a1': 'b1'}

特にエラーが出るわけでもなく、後ろに置いた変数の値が優先されるみたいですね。

次は |= です。

>>> d1 = {'a1': 'b1'}
>>> d2 = {'a2': 'b2'}

としたとき、 d1 |= d2d1.update(d2) と等価です。

>>> d1 |= d2
>>> d1
{'a1': 'b1', 'a2': 'b2'}

d1 を直接書き換えていますね

型ヒントのやつ

ちょうど一つ前の記事が型ヒントについてでしたが、これの中程で述べている、 List とか Dict とかをわざわざ import しなくても書けるようになったみたいです。

kesumita.hatenablog.com

from typing import List

とした上で List[str] のように書いていたのを単純に list[str] と書けるようになった感じです。地味にありがたいですね。

removeprefix と removesuffix

ドキュメント読めば一瞬で理解できるのでリンクだけ貼ります。

docs.python.org

この手の処理って今までどう書いてたか覚えてませんが便利ですね。

その他

datetime のタイムゾーン指定がちょっと拡張されたり、とかもあるみたいです。