概要
Python 3.9 の beta 版がきたらしい
本当は 8/4 に半分ぐらい書いたのですが、寝落ちしてしまい翌朝になったらなんか覚めてしまい書き上げるのが今になってしまいました。まぁ需要ないから誰も困りませんがね。
何が変わったのか
あんまりマニアじゃないので上から目立つところだけ斜め読みした程度ですが、 dict 型に対して新しい書き方が増えたり、型ヒントのときに使うクラスが組み込みになったりとか、そういうところは読み取れました。
以降、個人的に理解できそうでなおかつ興味が沸いたところだけちょっと試してみます。
遊ぶ
pyenv で入れる(のが無難でしょう)
$ pyenv install 3.9.0b5
dict のやつ
|
で dict の merge ができるようになり、 |=
で dict の update ができるようになったみたいです。
詳細はこちらにあります。
楽しそうですね。 |
の場合は新しくオブジェクトを生成し、 |=
の場合は 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
というキーに対して、それぞれ対応する値が b1
と b2
であるような dict 型変数 d1
と d2
をマージさせます。
>>> 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 |= d2
は d1.update(d2)
と等価です。
>>> d1 |= d2 >>> d1 {'a1': 'b1', 'a2': 'b2'}
d1
を直接書き換えていますね
型ヒントのやつ
ちょうど一つ前の記事が型ヒントについてでしたが、これの中程で述べている、 List
とか Dict
とかをわざわざ import しなくても書けるようになったみたいです。
from typing import List
とした上で List[str]
のように書いていたのを単純に list[str]
と書けるようになった感じです。地味にありがたいですね。
removeprefix と removesuffix
ドキュメント読めば一瞬で理解できるのでリンクだけ貼ります。
この手の処理って今までどう書いてたか覚えてませんが便利ですね。
その他
datetime のタイムゾーン指定がちょっと拡張されたり、とかもあるみたいです。