Python3.10の新機能 Python 3.10の新機能(その11) その他の変更

(その1) パターンマッチ(その2) with文のネスト(その3) エラーメッセージの改善(その4) | 演算子によるユニオン型の指定(その5) パラメータ仕様変数(その6) 明示的な型エイリアス(その7) ユーザ定義型ガード(その8) OpenSSL 1.1.1が必須に(その9) zip()関数に引数 strict を追加(その10) Dataclassでslotsが利用可能に(その11) その他の変更

その他、Python 3.10 で更新された機能から、お気に入りの項目を簡単に紹介します。

オックスフォード大学問題

さてみなさん、Pythonのインタープリタを起動して、次の式を実行してみてください。

In [2]:
0xfor-d*University
Out[2]:
15

一見、エラーになりそうに見えますが、15 という値が帰ってきます。なぜこんな結果になるのか、わかるでしょうか?

この式を見やすく変形すると、次のようになります。

0xf or (-d * University)

元の式 0xfor は、16進数の 0xf の直後に空白をつけずに or が続いているため、わかりにくくなっていました。

この式は、0xfTrue となるため、2つ目の項である -d * University の部分はまったく評価されません。このため、存在しない変数 dUniversity を使ってもエラーとはならないのです。

さて、この式で問題になるのは、

0xfor

の部分です。現在のPython文法では、空白があってもなくても結果が同じなら、空白無しで書いても良い となっています。a+b と書いても a + b と書いてもいいよ、ということですね。それならば16進数を使って 0xf+b と書いてもよいし、空白をあけずに or 演算子を使っても良いはずなのですが、実際にはちょっとちぐはぐになっています。

In [6]:
1or2
  File "/var/folders/2n/sy7zkxld6cg9_pmjj3437lm40000gn/T/ipykernel_52007/766369364.py", line 1
    1or2
     ^
SyntaxError: invalid syntax
In [7]:
1or 2
Out[7]:
1
In [8]:
1 or2
  File "/var/folders/2n/sy7zkxld6cg9_pmjj3437lm40000gn/T/ipykernel_52007/1085799728.py", line 1
    1 or2
      ^
SyntaxError: invalid syntax

ちょっとわかりにくいですね。

そこで、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デバッグできるようになりました。

Copyright © 2001-2021 python.jp Privacy Policy python_japan
Amazon.co.jpアソシエイト
Amazonで他のPython書籍を検索