Python在try/except块中键入注释



我不明白为什么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]对象

最新更新