Python 在 try/ except 块中输入注释

问题描述 投票:0回答:1

我不明白为什么 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 块中的原因,与 请求宽恕比请求许可更容易

那为什么会出错呢?

python python-typing mypy
1个回答
1
投票

你可以这样做

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

© www.soinside.com 2019 - 2024. All rights reserved.