我不明白为什么 mypy 会抱怨我的方法之一的类型错误:
def check_earliest(self, symbol: str) -> Optional[datetime]:
"""Return earliest date of available data for a given symbol."""
try:
return self.read(symbol).index.min()
except (KeyError, AttributeError):
return None
错误是:
“Optional[Any]”的“None”项没有属性“index”
我接受 self.read(symbol) 可能会返回 None,然后尝试访问其上的 index 属性将导致 AttributeError。但这正是我将其放在 try/ except 块中的原因,与 请求宽恕比请求许可更容易。
那为什么会出错呢?
你可以这样做
def check_earliest(self, symbol: str) -> Optional[SomeType]:
"""Return earliest date of available data for a given symbol."""
try:
data = self.read(symbol) # data is Optional[SomeType] and have't index attr
if data: # Check data is not None
return data.index.min() # and here linter knows what type it is
except (KeyError, AttributeError):
return None
或者如果你的Python版本>=3.8,像这样:
def check_earliest(self, symbol: str) -> Optional[SomeType]:
"""Return earliest date of available data for a given symbol."""
try:
if data := self.read(symbol):
return data.index.min()
except (KeyError, AttributeError):
return None
这是因为必须在 if 表达式中检查可选[SomeType] 对象,以便让 linter 知道它是什么。