我不明白为什么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
错误为:
项目"无";的";可选[任意]";没有属性";索引";
我接受self.read(symbol(可能返回None,然后尝试访问其上的索引属性将导致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
这是因为如果表达式要让linter知道它是什么,就必须签入可选的[SomeType]对象