Python 在 try/except 个块中键入注释
Python typing annotations in try/except blocks
我不明白为什么 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
错误是:
Item "None" of "Optional[Any]" has no attribute "index"
我接受 self.read(符号) 可能 return 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
这是因为必须检查 Optional[SomeType] 对象的 if 表达式才能让 linter 知道它是什么。
我不明白为什么 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
错误是:
Item "None" of "Optional[Any]" has no attribute "index"
我接受 self.read(符号) 可能 return 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
这是因为必须检查 Optional[SomeType] 对象的 if 表达式才能让 linter 知道它是什么。