pycharm类型检查器期望类型字典,得到'无'代替

时间:2017-07-20 15:31:47

标签: python pycharm typechecking

在此片段中:

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吗?

code snippet with error message

如果我将t()的返回类型注释为Optional[Dict],则类型检查器似乎只是满意,但此方法永远不会返回None,所以我不认为它应该是可选的。

如果我将self.bla__init__()的初始值更改为{},则返回值仍为None。如果我使用str而不是dict

,则会出现同样的错误

4 个答案:

答案 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