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 知道它是什么。