AnyStr应该如何使用?

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

我对 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]]

为什么这是一个错误?

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

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
© www.soinside.com 2019 - 2024. All rights reserved.