Pythonのdictsと静的型分析

ピーター・フェザーストーン:

このコードは、有効な一方で、mypy静的アナライザは、複数の方法で文句を作る理由を誰かが説明することができます:

ranges = dict()
ranges['max'] = 0
ranges['services'] = []
ranges['services'].append('a')

すなわち:

error: Incompatible types in assignment (expression has type "List[<nothing>]", target has type "int")

error: "int" has no attribute "append"

私は単に初期変数に型ヒントを追加した場合ranges: dict = dict()、それが正常に動作します。

私は、静的アナライザは、私が使用しています特にとして、自身でこれを考え出すことができない理由について混乱していますdict最初のインスタンスで辞書を初期化するためのキーワードを。

kaya3:

辞書は、通常、最も重要な操作は、関連付けられた値ルックアップするためにされて、キー付きのコレクションとして使用されている任意のキーを。通常、辞書にすべてのキーは、同じ型を持っており、すべての値が同じ型を持っています。値が不均一であるならば、式はranges[key](あなたが労働組合として、それを表すことができますが)必ずしも特定の型を持っていないでしょう。

あなたのコードでは、静的アナライザは、辞書の種類を推測しようとしています。それは期待型の形式であるまだ決定されるべきです。最初の割り当ては、両方の未知数についての情報が得られますように思わのようですしたがって、この時点では、タイプとして推測されますDict[K, V]KVranges['max'] = 0KstrVintrangesDict[str, int]

空のリストは、の値として使用することができないので、次の2行は、その後、エラーを与えDict[str, int]、およびからの値をDict[str, int]持っていないappend方法を。

明示的な型注釈は、ranges: dict = dict()値がすべて同じ型を持っている必要はありませんのでこと、これは異質辞書であることを指定することにより、デフォルトの動作を却下します。その情報が与えられ、静的アナライザは、値のため、1であることを前提としていないint、彼らはすべてのことを持っていることintの。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=12916&siteId=1