我有一个只能返回a
,b
或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
但正如我所说,我想在签名中表达该函数只返回那些特定值
答案 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)
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版本很可能会通过添加新功能或调整或删除有问题的功能来修改文字类型的行为。