PEPはPython Enhancement Proposalの略。
開発環境
# Docker
> python -V
Python 3.10.0a5
# ローカル
> python -V
Python 3.8.5
> mypy --version
mypy 0.800
PEP 604: New Type Union Operator
Unionを使う際の型アノテーションにはUnionが使用されていたが、|
のみも許容するようになった。
ここで、演算子のUnionと型のUnionが混在するので整理。
演算子のUnion
Unionとはdictクラスのマージ演算のことを指す。(PEP 584)
d1 = {"hoge": 1}
d2 = {"fuga": 2, "hoge": 3}
d3 = d1 | d2 # {'hoge': 3, 'fuga': 2}
型のUnion
Union[X, Y]
は X または Y を表す。(どちらかの型であればOK)
from typing import Union
U = Union[int, float]
def print_numeric(num: U):
print(num)
# error: Argument 1 to "print_numeric" has incompatible type "str"; expected "Union[int, float]"
print_numeric("a")
# ok!
print_numeric(1)
PEP 604: New Type Union Operator
本題。
from typing import Union
# 今まで
# def print_numeric(num: Union[int, float]):
# print(num)
# PEP 604
def print_numeric(num: int | float):
print(num)
print_numeric(1)
PEP 613: TypeAlias Annotation
タイプエイリアスと普通の代入の区別がつきにくいので、タイプエイリアス用のアノテーションが追加された。
# 今まで
HogeInt = int
# PEP 613
HogeInt: TypeAlias = int
PEP 618: Add Optional Length-Checking To zip
zip関数に strict
というオプションが追加。
このオプションがTrueのとき、zipに渡すイテラブルの長さが異なると例外を出す。
A = [1, 2, 3]
B = [7, 6, 5, 11]
# 今まで: エラーにならず、3回for文が実行される
for a, b in zip(A, B):
print(a - b)
# PRP618: 4回目のfor文実行時に例外が出される。(3回までは通常通り実行される)
for a, b in zip(A, B, strict=True):
print(a - b)
Better error messages in the parser
構文解析時のエラーメッセージが改善された。
hoge = [1, 2, 3
# python3.8.5
# SyntaxError: unexpected EOF while parsing
# Python 3.10.0a5
# SyntaxError: '[' was never closed
dockerコマンドメモ
忘れるのでメモ。
# コンテナを起動しっぱなしにする
> docker run -itd {IMAGE_ID}
# コンテナに潜る
> docker exec -it {CONTAINER_ID} sh