36

我有一个只能返回的函数ab或者c,它们都是类型T。我想在签名中包含这个事实,因为它们在函数上下文中具有特殊含义。我怎么做?

目前,我使用这个

def fun(...) -> "a or b or c":
    #briefly explain the meaning of a, b and c in its docstring

那是正确的吗?

我知道我能做到

def fun(...) -> T:
    # briefly explain the meaning of a, b and c in its docstring

但正如我所说,我想在签名中表示该函数只返回那些特定的值。

4

3 回答 3

62

您可以使用文字类型来做到这一点。

from typing_extensions import Literal
# from typing import Literal  # Python 3.8 or higher

def fun(b: int) -> Literal["a", "b", "c"]:
    if b == 0:
        return "a"
    if b == 1:
        return "b"
    return "d"

mypy 能够将 检测return "d"为无效语句:

error: Incompatible return value type (got "Literal['d']",
expected "Union[Literal['a'], Literal['b'], Literal['c']]")

蟒蛇 3.8

感谢PEP 586,默认情况下Literal已经包含在 Python 3.8typing模块中。

于 2019-07-16T13:44:23.410 回答
16

您不能仅使用类型提示来指定您的函数仅返回类型值的子集。顾名思义,类型提示是关于类型而不是值。

但是,您可以创建一个enum.Enum仅包含您要返回的值的新子类型,并在函数中使用它。然后你可以输入提示你正在返回枚举类型。

import enum

class cmp_results(enum.IntEnum):
    less = -1
    equal = 0
    greater = 1

def my_cmp_function(x, y) -> cmp_results:
    if x < y: return cmp_results.less
    elif x == y: return cmp_results.equal
    else: return cmp_results.greater

这可能是矫枉过正。只是提示int返回类型(并记录特定值)可能就足够了。

于 2016-09-08T19:05:17.230 回答
0

如果所有都是相同的确切类型,只需将其添加为返回类型

def func(...) -> T: # or int or whatever else

我想在签名中表示该函数只返回那些特定的值

类型提示不指定名称或值,它们只是指定类型;类型检查器尝试对提供的类型进行操作

如果您只是出于文档目的而这样做,'a or b or c请根据需要添加 ';用户会理解它,但类型检查器不会,他们肯定不会对其采取行动。

于 2016-09-08T18:48:56.763 回答