その他、Python 3.10 で更新された機能から、お気に入りの項目を簡単に紹介します。
オックスフォード大学問題¶
さてみなさん、Pythonのインタープリタを起動して、次の式を実行してみてください。
0xfor-d*University
一見、エラーになりそうに見えますが、15
という値が返ってきます。なぜこんな結果になるのか、わかるでしょうか?
この式を見やすく変形すると、次のようになります。
0xf or (-d * University)
元の式 0xfor
は、16進数の 0xf
の直後に空白をつけずに or
が続いているため、わかりにくくなっていました。
この式は、0xf
が True
となるため、2つ目の項である -d * University
の部分はまったく評価されません。このため、存在しない変数 d
や University
を使ってもエラーとはならないのです。
さて、この式で問題になるのは、
0xfor
の部分です。現在のPython文法では、空白があってもなくても結果が同じなら、空白無しで書いても良い となっています。a+b
と書いても a + b
と書いてもいいよ、ということですね。それならば16進数を使って 0xf+b
と書いてもよいし、空白をあけずに or
演算子を使っても良いはずなのですが、実際にはちょっとちぐはぐになっています。
1or2
1or 2
1 or2
ちょっとわかりにくいですね。
そこで、1or
のように、数値の直後に and else for if in is or
などの予約語が続く式はDeprecateされました。Python3.10では警告が出力されますが、将来はエラーとなります。
Dataclassのキーワード専用フィールド¶
Dataclass 作成時、属性をキーワードとしてのみ指定可能にする機能が追加されました。
全ての属性をキーワードのみで指定する場合には、次のように指定します。
# 全ての属性をキーワードで指定しなければならない
# 例: Data(field1=1, field2='A')
@dataclass(kw_only=True)
class Data:
field1: int
field2: str
一部の属性のみをキーワードのみで指定するには、次のように指定します。
# 全てのfield2のみ、属性をキーワードで指定しなければならない
# 例: Data(1, field2='A')
@dataclass
class Data:
field1: int
field2: str = field(kw_only=True)
データ型が KW_ONLY の属性があると、以降の属性は全てキーワードでのみ指定できます。KW_ONLY
を指定した属性は単なるしるしとなり、作成されません。
# KW_ONLY 以降の、field2とfield3はキーワードで指定しなければならない
# 例: Data(1, field2='A', field3='B')
@dataclass
class Data:
field1: int
_: KW_ONLY
field2: str
field32: str
PEP 626 -- Precise line numbers for debugging and other tools¶
本来、PEP 626 -- Precise line numbers for debugging and other tools は一般的なPythonの開発にはあまり影響しない修正なのですが、このPEPの副作用で、長年修正されず、とても不便だったBugがついに解消されたようです。
問題のBugはbpp-16482 pdb.set_trace() clobbering traceback on error で、pdb を使ってデバッグしていると、例外が発生したときにトレースバック情報で表示されるエラー位置が正しく表示されない、という障害でした。なかなか修正されなくて残念なBugだったのですが、ようやく安心してpdbデバッグできるようになりました。