仅返回一组特定值的函数的类型提示
- 2025-02-25 09:07:00
- admin 原创
- 24
问题描述:
我有一个函数,它只能返回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
但正如我所说,我想在签名中表达该函数只返回那些特定的值。
解决方案 1:
您可以使用文字类型来做到这一点。
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 586,它Literal
已默认包含在 Python 3.8typing
模块中。
解决方案 2:
您无法仅使用类型提示来指定函数仅返回类型值的子集。顾名思义,类型提示与类型有关,而非值。
但是,您可以创建一个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
返回类型(并记录具体值)可能就足够了。
解决方案 3:
如果所有都是相同的类型,只需将其添加为返回类型:
def func(...) -> T: # or int or whatever else
我想在签名中表达该函数只返回那些特定的值
类型提示不指定名称或值,它们只指定类型;类型检查器会尝试根据提供的类型采取行动。
如果您只是为了文档目的而这样做,请'a or b or c
根据需要添加 ' ;用户会理解它,但类型检查器不会理解,而且他们肯定不会对其采取行动。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD