変数と少し複雑なシナリオを検討します: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つの唯一の方法が必要です。
(明示的な型ヒントはその後、潜在的に埋め割り当てを読み多くの方が簡単ですので、私は読みやすさを含め)
ヒントは、任意のコードを実行せずに作られているタイプを覚えています。どのような種類のデータが辞書に格納されているのかを推測することができる多くのケースについて考えることはできません。 –
タイプが何であるかが分かっている場合に自動タイプのヒントが実装されていると、多くの人がバグであると不平を言うことはほとんどありません。あなたが投稿した例、またはPythonのリテラルと同等のもの、あるいは戻り値に注釈が付けられた関数呼び出しであっても、うまく動作していることは唯一のことです。 –
キーの値である値のペアは、何でも構いません。値オブジェクトの型を自動的に推測するには、PyCharmに質問するのが大変だと思います。 @ TadhgMcDonald-Jensenによれば、PyCharmは実際にPythonコードを実行していないので、型を知ることはできません。タイプヒントのように思えますが、ここでは良いオプションです。 – PurpleDiane