是否可以组合(也许不是正确的词)两组或多组类型提示,以便它们仅在特定组合中有效?
我有一个接受
value
和 value_type
参数的函数。 (这些后来被输入到 graphQL API 中,我使用这两个值在查询字符串中设置过滤,即 "endpoint(value_type: value) {...}"
,所以我需要分别了解这两个项目)
value_type
已输入为 Literal["option1", "option2", "secret third option"]
value
可以是 int
或 str
,目前我只是输入 Union[int, str]
,这对我来说很好,因为显然是我写的,但如果其他人使用这个库,我会希望更清楚:
我想要的是更有活力,例如
value_type
的 "option1"
必须 具有以 str
形式给出的值,而 "option2"
必须带有 int
等。
目前我只使用匹配/大小写和一些
assert
来验证,但我更希望 IDE 在运行之前指示存在问题,而无需编写一些大量的文档。
我反对创建两个函数,因为代码的其余部分是相同的,如果它是一个满足 graphQL 查询格式的字符串,它只是添加一些引号。
您可以使用
typing.overload
来实现这一点。请参阅https://docs.python.org/3/library/typing.html#typing.overload。
要使用它,请编写不带注释的函数,然后使用装饰器为所有组合添加定义
@typing.overload
。
@typing.overload
def function(value: str, value_type: Literal["option1"]) -> str:
...
@typing.overload
def function(value: int, value_type: Literal["option2"]) -> int:
...
def function(value, value_type):
if value_type == "option1":
return value + "1"
elif value_type == "option2":
return value + 1
else:
raise ValueError()
我不确定你为什么需要
value_type
。如果您不需要它,您可以使用 Union
代替 value
,并且您的静态类型检查器应该能够缩小匹配/大小写内的类型。