2016-05-03 4 views
3

辞書値の種類を認識しません。 、私はPyCharmが私にlistために利用可能なメソッドのリストを表示することを期待しますが、PyCharmは、この単純なケースで辞書値の種類を認識できない:PyCharmは私が空リストとして辞書の値を設定し、簡単なコードスニペットを持って

enter image description here

は、なぜそれが起こっていると私は何ができるのでしょうか? PyCharm 2016.1.2、Python 2.7.10を使用する。回避策として


、私は明示的にPyCharmがnew_dictキーは整数と値ある辞書であることを知らせ、type hintを追加することができます# type: dict[int, list]インラインコメントを追加することによって、リストである:

enter image description here

+1

ヒントは、任意のコードを実行せずに作られているタイプを覚えています。どのような種類のデータが辞書に格納されているのかを推測することができる多くのケースについて考えることはできません。 –

+2

タイプが何であるかが分かっている場合に自動タイプのヒントが実装されていると、多くの人がバグであると不平を言うことはほとんどありません。あなたが投稿した例、またはPythonのリテラルと同等のもの、あるいは戻り値に注釈が付けられた関数呼び出しであっても、うまく動作していることは唯一のことです。 –

+1

キーの値である値のペアは、何でも構いません。値オブジェクトの型を自動的に推測するには、PyCharmに質問するのが大変だと思います。 @ TadhgMcDonald-Jensenによれば、PyCharmは実際にPythonコードを実行していないので、型を知ることはできません。タイプヒントのように思えますが、ここでは良いオプションです。 – PurpleDiane

答えて

1

変数と少し複雑なシナリオを検討します:PyCharmはxはどちらかということを検出することが可能であるため、最後の行は、私たちにint sおよびstr秒のすべてのメソッドを提供します。この場合

for i in range(10): 
    if i%2: 
     x = 3 
    else: 
     x = "hello" 
    x. #type hint for both int and str 

intまたは今my_dict[i]xのすべての出現箇所を置き換えるstr

こと:

my_dict = {} 
for i in range(10): 
    if i%2: 
     my_dict[i] = 3 
    else: 
     my_dict[i] = "hello" 
    my_dict[i]. #no type hint :(

上記と同じ規則が適用され、my_dict[i]intまたはstrのいずれかになります(PyCharmが把握できることがわかっています)。

dictを初期化していないとどうなりますか?

def f(my_dict): #or even (my_dict:dict) 
    my_dict[1]. #cannot possibly expect a type hint 

この場合、辞書の値はちょうどあなたのような明示的な注釈を追加すると、あなたの例の場合になり、他何であるかを知る方法はありません。

def f(my_dict:"dict[int,list]"): 
    my_dict[1]. #get all the list methods 

これは本当にいくつかの行を強化するにはThe Zen of Python

明示的なものは暗黙的なものよりも優れています。
可読性が重要です。
あいまいさに直面して、推測する誘惑を拒否します。
これを実行するには、1つ、好ましくは1つの唯一の方法が必要です。

(明示的な型ヒントはその後、潜在的に埋め割り当てを読み多くの方が簡単ですので、私は読みやすさを含め)

2

私はPyCharmがコードからあまりに多くを推測できると期待していると思います。

タイプヒントアノテーションを提供すると、コード補完オプションを示すために必要な情報がPyCharmに与えられます。この場合、PyCharmに、各辞書要素の値がどのような型になるかを明示しています。

ヒントアノテーションなしでは、PyCharmは、ループの内部に割り当てるときに、辞書の要素値がどのようになるかを知ることができると期待しています。それはPyCharmが作ることをあまりにも前提としています。コメントでTadhg McDonald-Jensenが言及したように、PyCharmがそれを確実に理解するには、これはあまりにもダイナミックな状況です。コード補完はあまりにも頻繁に間違っています。

関連する問題