我对 Python 中的注释还很陌生,并试图将它们应用到我正在工作的项目中。我真的无法从
AnyStr
包中找出typing
类型。
docs 说:
AnyStr 是一个约束类型变量,定义为 AnyStr = TypeVar('AnyStr', str, bytes)
它旨在用于可以接受任何类型的字符串而不允许混合不同类型的字符串的函数。
所以我得到这个就像它是 str 或 bytes.
在我的项目中,我有一个这样的功能:
def x() -> Tuple[Optional[AnyStr], Optional[dict]]:
if something:
return logic1(), logic2()
return None, None
logic1
在这种情况下返回一个 AnyStr
和 logic2
一个字典。但是,mypy
显示此错误:
不兼容的返回值类型(得到“Tuple[str, Dict[Any, Any]]”,预期为“Tuple[bytes, Dict[Any, Any]]”)
我不明白为什么这被视为错误。据我了解
AnyStr
,预期值应该是Tuple[bytes, Dict[Any, Any]]
或Tuple[str, Dict[Any, Any]]
。
为什么这是一个错误?
docs 给出的例子是一个函数,它接受任何一种字符串,并返回相同的类型:
def concat(a: AnyStr, b: AnyStr) -> AnyStr:
考虑到这一点,以下是如何在您的代码中使用
AnyStr
:
def logic1(s:AnyStr) -> AnyStr:
return 2 * s # For example
def logic2() -> dict:
return {}
something = True
def x(s:AnyStr) -> Tuple[Optional[AnyStr], Optional[dict]]:
if something:
return logic1(s), logic2()
return None, None
这通过
mypy
没有问题。
如果你只是想要一个可能是字符串或
bytes
的类型,你最好使用Union[str,bytes]
:
def logic1() -> Union[str,bytes]:
return 'hi'
def logic2() -> dict:
return {}
something = True
def x() -> Tuple[Optional[Union[str,bytes]], Optional[dict]]:
if something:
return logic1(), logic2()
return None, None