Python 3.12中使用Pyright时为何无法将AnyStr作为返回类型?
Pyright中AnyStr作为返回类型的错误解决方法
问题原因
你写的代码里,name参数被指定为str类型,导致Pyright将返回值的AnyStr绑定为str。但函数的返回值可能是bytes(来自result["SecretBinary"]),这和绑定后的str类型冲突,因此触发类型错误。
关于AnyStr的核心规则(翻译自Python官方文档)
AnyStr是Union[str, bytes]的泛型版本,专门用于约束函数的输入和输出类型一致:如果函数接收str类型的参数,返回值必须也是str;如果接收bytes类型的参数,返回值必须也是bytes。它只能用作函数参数、返回值或泛型类的类型参数,不能用来注解变量。
解决方案
方案1:改用Union[str, bytes]作为返回类型
如果你的函数实际返回的就是str或bytes,不需要强制输入输出类型一致,直接用Union[str, bytes]替代AnyStr即可:
from typing import Any, Union def get_secret(self, name: str, **kwargs: Any) -> Union[str, bytes]: kwargs["SecretId"] = name result = self.client.get_secret_value(**kwargs) return result["SecretBinary"] if "SecretBinary" in result else result["SecretString"]
方案2:保留AnyStr,调整参数类型并辅助类型断言
如果确实需要保证输入输出类型一致,把name参数改为AnyStr,同时用cast告诉Pyright返回值的类型和输入的AnyStr匹配:
from typing import Any, AnyStr, cast def get_secret(self, name: AnyStr, **kwargs: Any) -> AnyStr: kwargs["SecretId"] = name result = self.client.get_secret_value(**kwargs) if "SecretBinary" in result: return cast(AnyStr, result["SecretBinary"]) else: return cast(AnyStr, result["SecretString"])
这样当你传入str类型的name时,Pyright会推断返回值为str;传入bytes类型的name时,推断返回值为bytes,类型检查就能通过。
内容的提问来源于stack exchange,提问作者Shuzheng
相关产品推荐
相关产品推荐

