在此片段中:
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
,所以我不认为它应该是可选的。
如果我将self.bla
中__init__()
的初始值更改为{}
,则返回值仍为None
。如果我使用str
而不是dict
答案 0 :(得分:2)
你 CAN 做了什么,但不应该这样做:
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中类型提示尚未完全实现,所以可能仍然会来......我不记得我在哪里读到这个,所以不能保证!
答案 1 :(得分:1)
我发现Type提示实例变量起作用。我似乎也没有在pycharm的2018专业版中引发原始检查错误,因此我想知道他们是否已将检查更新为更智能。
json_encode
答案 2 :(得分:1)
使用以下-> Dict or None
批注pycharm(2019.2)并没有抱怨,我得到dict
的{{1}}类型自动填充:
fdictnoneres
使用def fdictnone() -> Dict or None:
return dict(a=1, b=2)
fdictnoneres = fdictnone()
时,pycharm不为TypeVar
提供dict
类型的自动补全功能:
tfunres
答案 3 :(得分:0)
我很确定这是因为它在构造函数上被初始化为None。 我相信,如果您在类定义中明确声明类型,它应该可以工作。例如:
class T:
bla: Dict
def __init__(self):
self.bla = None