【发布时间】:2017-12-26 09:58:02
【问题描述】:
在这个sn-p中:
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,则会出现同样的错误
【问题讨论】:
-
可能是因为
if self.bla is None签入你的代码。 -
if self.bla:后面紧跟self.bla = ____,没有代码路径可以离开它None -
伙计,python 是一种动态类型的语言。例如,您可以覆盖
__setattr__属性,以便self.bla将您的bla设置为 None。我认为pycharm的行为是一致的。 -
如果是这样,那么为什么类型检查器会如此确定
self.bla是None?我知道 python 是动态的,你可以深入 cloud-coo-coo-land,但类型检查器只能处理它看到的内容。考虑到这一点,你能说出为什么None的测试让它认为价值仍然是None,而当它明显改变为不是的东西时? -
更多的是类型检查器不能确定它我 not None,遇到这个问题是为了解决它可以是 None 的问题,所以我使用了 Optional[dict]
标签: python pycharm typechecking