什么是正确的类型提示提示只返回一组特定值的函数?

时间:2016-09-08 18:45:32

标签: python python-3.x type-hinting

我有一个只能返回abc的函数,所有这些函数都属于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

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

3 个答案:

答案 0 :(得分:10)

您无法单独使用类型提示指定您的函数仅返回类型值的子集。顾名思义,类型提示完全是关于类型而不是值。

但是,您可以创建一个新的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作为返回类型(并记录特定值)可能已经足够了。

答案 1 :(得分:1)

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

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

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

类型提示不要指定名称或值,只需指定类型;类型检查器尝试

如果您出于文档目的而这样做,请添加'a or b or c&#39;如果你想要它;用户会理解它,但输入赢得的选手,他们肯定不会采取行动。

答案 2 :(得分:0)

您可以使用literal types来做到这一点。

from typing_extensions import Literal


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']]")

截至2019年,Literal是一项官方支持的功能,但仍处于高度试验阶段,应视为处于alpha阶段。未来的mypy版本很可能会通过添加新功能或调整或删除有问题的功能来修改文字类型的行为。