1. ホーム
  2. python

[解決済み] この奇妙な大腸の動きは何なのか?

2022-10-19 08:11:47

質問

Python 3.6.1を使っているのですが、とても不思議なことに出くわしました。私は単純な辞書の割り当てのtypoがあり、それを見つけるのに長い時間がかかりました。

context = {}
context["a"]: 2
print(context)

出力

{}

どのようなコードかというと context["a"]: 2 は何をしているのでしょうか?これは SyntaxError を発生させません。最初はスライスを作っているのかと思いました。しかし repr(context["a"]: 2) と入力すると SyntaxError . また context["a"]: 2 と入力しても、コンソールには何も表示されませんでした。私は、もしかしたらそれが None を返したのかと思いましたが、そうでもないようです。

1行のif文でもいいのではとも思いましたが、それも正しい構文ではないはずです。

さらに context["a"] を発生させる必要があります。 KeyError .

私は当惑しています。どうなっているのでしょうか?

どうすれば解決するのでしょうか?

誤って構文的に正しい 変数アノテーション . この機能は Python 3.6 で導入されました ( PEP 526 ).

変数アノテーションは アノテーションされた代入 の一部として解析されますが、代入文は 任意 :

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

このように context["a"]: 2

  • context["a"] はアノテーションの対象
  • 2 はアノテーション自身です。
  • context["a"] は初期化されないまま

PEP では、次のように記述されています。 "アノテーションのターゲットは、少なくとも構文的には、任意の有効な単一の割り当てターゲットにすることができます(これをどうするかはタイプチェッカー次第です)"。 これは、アノテーションを付けるためにキーが存在する必要がないことを意味します (そのため KeyError ). 以下は、オリジナルの PEP からの例です。

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

通常、アノテーション式 が必要です。 はPythonの型に評価されます。 アノテーションの主な用途は型ヒンティングですが、強制されるわけではありません。アノテーションは任意の 有効な アノテーションは、結果の型や値に関係なく、任意の有効なPython式です。

ご覧の通り、現時点では型ヒントは非常に寛容であり、以下のような静的型チェッカがない限り、ほとんど役に立ちません。 mypy .