我在 python 中有一个函数,它可以返回 bool
或 list
。有没有办法使用类型提示指定返回类型?
例如,这是正确的方法吗?
def foo(id) -> list or bool:
...
类打字。联合联合类型; Union[X, Y] 表示 X 或 Y。
因此,表示多个返回数据类型的正确方法是
from typing import Union
def foo(client_id: str) -> Union[list,bool]
但请注意,不强制键入。 Python 仍然是一种动态类型的语言。已开发注释语法以帮助在发布到生产之前的代码开发过程中。正如 PEP 484 所述,“运行时不会进行类型检查”。
>>> def foo(a:str) -> list:
... return("Works")
...
>>> foo(1)
'Works'
如您所见,我正在传递一个 int 值并返回一个 str。但是 __annotations__
将设置为相应的值。
>>> foo.__annotations__
{'return': <class 'list'>, 'a': <class 'str'>}
请通过 PEP 483 了解有关类型提示的更多信息。另见What are type hints in Python 3.5??
请注意,这仅适用于 Python 3.5 及更高版本。这在 PEP 484 中明确提及。
从 Python 3.10 开始,有一种新的方式来表示这个联合。请参阅Union Type:
联合对象保存 | 的值(按位或)对多种类型对象的操作。这些类型主要用于类型注释。与 typing.Union 相比,联合类型表达式支持更简洁的类型提示语法。
如我们所见,这与之前版本中的 typing.Union
完全相同。我们之前的示例可以修改为使用此表示法:
def foo(client_id: str) -> list | bool:
如果有人在这里搜索“如何指定多个返回值的类型?”,请使用 Tuple[type_value1, ..., type_valueN]
from typing import Tuple
def f() -> Tuple[dict, str]:
a = {1: 2}
b = "hello"
return a, b
更多信息:How to annotate types of multiple return values?
评估时的语句 def foo(client_id: str) -> list or bool:
等效于 def foo(client_id: str) -> list:
,因此不会执行您想要的操作。
描述“A 或 B”类型提示的原生方式是 Union(感谢 Bhargav Rao):
def foo(client_id: str) -> Union[list, bool]:
或者,starting with Python 3.10 and beyond,使用 |
运算符:
def foo(client_id: str) -> list | bool:
我不想成为“你为什么要这样做”的人,但也许有两种返回类型不是你想要的:
如果你想返回一个 bool 来指示某种特殊的错误情况,请考虑使用 Exceptions 代替。如果您想返回一个布尔值作为一些特殊值,那么空列表可能是一个很好的表示。您还可以指示 None
可以与 Optional[list]
一起返回
str
和 None
(即 -> str | None
)时,|
运算符不起作用。在这种情况下,我得到 TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'
。但是,Union
可以正常工作。
Optional[X]
Python 3.10(使用 |
):一个函数的示例,该函数接受一个 int
或 str
参数并返回 int
或 str
:
def func(arg: int | str) -> int | str:
^^^^^^^^^ ^^^^^^^^^
type of arg return type
Python 3.5 - 3.9(使用 typing.Union
):
from typing import Union
def func(arg: Union[int, str]) -> Union[int, str]:
^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^
type of arg return type
对于 X | None
的特殊情况,您可以使用 Optional[X]
。
foo( bar: int )
和 foo( bar ) -> int
之间具体有什么不同(如果有的话)
在基础 Python 中,只需执行以下操作:
def foo(x: (list, str)):
pass