このスニペットの内容:
_from typing import Dict, Optional
class T:
def __init__(self):
self.bla = {}
def t(self) -> Dict:
if self.bla is None:
self.bla = {'not none': 'nope!'}
return self.bla
_
Intellij/pycharmのタイプチェッカーがこのメソッドの戻り値がNone
であると考える理由を誰かが説明できますか?
型チェッカーは、t()
の戻り値の型に_Optional[Dict]
_の注釈を付けた場合にのみ満足しているように見えますが、このメソッドはNone
を返すことはできないため、そうすべきではないと思います。オプション。
__init__()
の_self.bla
_の初期値を_{}
_に変更しても、戻り値はNone
のままです。 str
の代わりにdict
を使用した場合も同じエラーが発生します
あなたが[〜#〜]できる[〜#〜]できること、しかしすべきではないことはこれです:
class T:
def __init__(self):
self.bla = {}
def t(self) -> dict:
if self.bla is None:
result = {'not none': 'nope!'}
self.bla = result
return result
else:
return self.bla
このようにして、変数は個別に認識されます。ただし、この解決策はばかげていることに注意してください-あなたは私がPyCharmのバグと見なすものの回避策を実行しているだけです!実際、私は同じ問題を抱えていますが、それでも解決策はありません...
今のところ、警告を無視するか、PyCharmに警告を無視するように強制することをお勧めします:
# noinspection PyTypeChecker
私はどこかで、型ヒントがまだPyCharmに完全に実装されていないことを読んだので、それはまだ来るかもしれません...しかし、これをどこで読んだか覚えていないので、保証はありません!
次の-> Dict or None
アノテーションpycharm(2019.2)は文句を言わず、dict
のfdictnoneres
タイプのオートコンプリートを取得します。
def fdictnone() -> Dict or None:
return dict(a=1, b=2)
fdictnoneres = fdictnone()
TypeVar
を使用する場合、pycharmはdict
のtfunres
タイプのオートコンプリートを提供しません。
from typing import TypeVar
T = TypeVar('T', dict, None)
def tfun() -> T:
return dict(a=1, b=2)
tfunres = tfun()
インスタンス変数が機能することを示唆するTypeが見つかりました。また、2018プロバージョンのpycharmでは元の検査エラーが発生していないようですので、検査が少し賢くなるように更新されているのではないかと思います。
class T(object):
def __init__(self):
self.bla:Dict = None
def t(self) -> Dict:
if self.bla is None:
self.bla = {'foo' : 'bar'}
return self.bla
コンストラクターでNoneとして初期化されているためだと確信しています。クラス定義で型を明示的に指定すれば、それは機能するはずです。例えば:
class T:
bla: Dict
def __init__(self):
self.bla = None