如何使用类型提示指定多个返回类型

Yah*_*din 141 python return-type type-hinting python-3.x python-3.5

我在python中有一个函数可以返回a bool或a list.有没有办法使用类型提示指定返回类型.

例如,这是正确的方法吗?

def foo(id) -> list or bool:
      ...
Run Code Online (Sandbox Code Playgroud)

Bha*_*Rao 213

文档中

typing.Union

联盟类型; Union [X,Y]表示X或Y.

因此,表示多个返回数据类型的正确方法是

from typing import Union


def foo(client_id: str) -> Union[list,bool]
Run Code Online (Sandbox Code Playgroud)

但请注意,不强制输入.Python仍然是动态类型的语言.开发注释语法是为了在代码开发之前帮助发布到生产环境中.正如PEP 484所述,"在运行时没有进行类型检查."

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'
Run Code Online (Sandbox Code Playgroud)

如您所见,我传递一个int值并返回一个str.但是,__annotations__将设置为相应的值.

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}
Run Code Online (Sandbox Code Playgroud)

有关类型提示的更多信息,请参阅PEP 483.另请参阅Python 3.5中的什么类型提示

请注意,这仅适用于Python 3.5及更高版本.这在PEP 484中清楚地提到.

  • @YahyaUddin 不 - [PEP 484](https://www.python.org/dev/peps/pep-0484/) :'( .... 它仅适用于 Python3.5 以上。 (3认同)
  • 那么让我看看我是否得到了这个.Python 3.4具有函数注释,除了未强制执行的注释之外,它不会执行任何操作.但在Python 3.5中,这是实际的类型检查. (2认同)
  • 如果你想强制输入,有几个模块可以做到这一点,我使用的一个是 typeguard (我与它的作者没有任何关系)。要使用它,请执行“from typeguard import typechecked”,然后在要强制执行输入的任何函数或类之前在新行中添加“@typechecked”。您可能需要执行“pip install typeguard”才能正常工作。 (2认同)

Ant*_*dak 70

如果有人在这里搜索“如何指定多个返回值的类型?”,请使用 Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b
Run Code Online (Sandbox Code Playgroud)

更多信息:如何注释多个返回值的类型?

  • 根据文档,这是正确的方法(返回 N 类型):https://docs.python.org/3/library/typing.html#typing.Tuple;而返回 Union 实际上应该返回 N 类型值之一。 (3认同)

xjc*_*jcl 33

Python 3.10(使用|):一个函数的示例,它接受一个intor的单个参数str并返回一个intor str

def func(arg: int | str) -> int | str:
              ^^^^^^^^^     ^^^^^^^^^ 
             type of arg   return type
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

对于特殊情况,X | None您可以使用Optional[X].

  • 对我来说,这个答案是最有帮助和启发性的。它基本上以非常简洁的形式包含了所有其他答案的信息(除了那些建议非多种类型替代方案的答案或评论)。尽管OP没有具体询问多个参数类型,但如何使用它们以及多个返回类型的描述使答案更加完整。虽然我给出了一个单一类型的例子,但我也很欣赏这个答案消除了任何关于 `foo( bar: int )` 和 `foo( bar ) 之间的不同之处(如果有的话)的任何混乱(就像我所遇到的那样) - &gt; int` (5认同)
  • @Floella它将不兼容,语法在3.10中更改为包含Union运算符,在此之前它是一个语法错误。 (3认同)
  • 感谢您的赞扬(:我试图给出一个简短且直观的答案 (2认同)

Fel*_*elk 18

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]:
Run Code Online (Sandbox Code Playgroud)

我不想成为"你为什么要这样做"的家伙,但也许有2种回归类型并不是你想要的:

如果要返回bool以指示某种特殊错误情况,请考虑使用异常.如果你想将bool作为一些特殊值返回,那么一个空列表可能是一个很好的表示.您还可以指示None可以返回Optional[list]

  • 有些用途可能会返回多种类型:例如,如果您需要返回某些子类型中的一种,而不是其他子类型,或者如果您正在尝试处理数据并希望在处理时返回原始表单不可用.此外,如果要包装遗留代码,它可能非常有用,因为它有助于升级过程和/或看到尴尬的地方. (4认同)
  • 当我试图指示我允许我的函数返回“str”和“None”(即“-&gt; str | None”)时,“|”运算符不起作用。在这种情况下,我得到 `TypeError: unsupported operand type(s) for |: 'type' and 'NoneType'`。不过,“Union”工作正常。 (2认同)