为仅返回一组特定值的函数键入提示

新手上路,请多包涵

I have a function that can only return a , b or c , all of them are of type 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

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

原文由 Copperfield 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 394
2 个回答

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

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

Python 3.8

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

原文由 Cesar Canassa 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

原文由 Blckknght 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题