この奇妙な結腸の行動は何をしているのですか?


104

私はPython 3.6.1を使用していますが、非常に奇妙なことに遭遇しました。簡単な辞書の割り当てミスがあり、見つけるのに長い時間がかかりました。

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

出力

{}

コードは何をしcontext["a"]: 2ていますか?SyntaxErrorIMOが必要な場合は発生しません。最初はスライスを作成していると思いました。ただし、入力repr(context["a"]: 2)するとSyntaxError。が発生します。context["a"]: 2コンソールにも入力したところ、コンソールに何も表示されませんでした。多分戻ると思いましたNoneが、よくわかりません。

また、1行のifステートメントである可能性も考えましたが、これも正しい構文ではありません。

さらに、context["a"]を上げる必要がありKeyErrorます。

私は困惑しています。何が起こっている?


2
すでにこの質問には誤りがあり、Pythonの初心者にとってこれが紛らわしいことは明らかです。Pythonが唯一の言語である場合、これは最悪だと思います。初期化前の型ヒントと変数の定義は、一般的に異質であると思われる可能性があります。この動作は意図的であり、PEP 526で説明されているように時々役立ち、互換性を壊したくないので、エラーを発生させることは不可能だと思います。しかし、Python開発者がいくつかのケースで有用な警告メッセージを追加することを検討するのではないかと思います。
Chris_Rands 2018年

1
これはあなたの質問に答えますか?Python 3.6の変数アノテーションとは何ですか?
ジョージー

回答:


98

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

変数アノテーションはアノテーション付き割り当ての一部として解析されますが、割り当てステートメントはオプションです

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

したがって、 context["a"]: 2

  • context["a"] 注釈ターゲットです
  • 2 注釈そのものです
  • context["a"] 初期化されていません

PEPは、「注釈のターゲットは、少なくとも構文的には(これをどうするかは型チェッカー次第です)、任意の有効な単一割り当てターゲットにすることができる」と述べています。つまり、キーが存在する必要はありません。注釈付き(したがってno KeyError)。以下は、元のPEPの例です。

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

通常、注釈式 Python型に評価される必要があります -注釈の主な用途はすべて型ヒントですが、強制されていません。注釈には、結果のタイプや値に関係なく、任意の有効な Python式を使用できます。

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


12
これには=代入演算子が必要ではないでしょうか?キーが存在しません。これは私には間違っていると感じています。
justengel

1
この場合、: 代入演算子です。キーではなく、型注釈だけを「割り当てる」だけです。許可する理由は何もないのではないかと思います。注釈構文を追加することによる意図しない副作用です。
chepner

1
@chepnerこれは副作用ではないようです。これは、対応するPEPが行うように設計されたものとまったく同じです。
Ma0

6
ただし、まだ定義されていないターゲットに注釈を付けることができるのは奇妙です。最初の行がでx: strあり、直後にが続いているtype(x)場合、インタープリターはを発生させNameErrorます。IMOは、オブジェクトが強制する必要のある構文が事前定義されているか、その場で定義されます。これは混乱を招くだけです。
r.ook 2018年

2
@Idlehandsこれは目的を無効にします。x = 'i am a string'前に持つとx: str後者の種類が冗長になります。これはまったく追加されるべきではありませんでした。コメントとしては大丈夫でした。私はそれが何らかの方法で使用されたことを決して示しません。
Ma0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.