选择性/组合类型提示(文字等)

问题描述 投票:0回答:1

是否可以组合(也许不是正确的词)两组或多组类型提示,以便它们仅在特定组合中有效?

我有一个接受

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 查询格式的字符串,它只是添加一些引号。

python type-hinting
1个回答
0
投票

您可以使用

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
,并且您的静态类型检查器应该能够缩小匹配/大小写内的类型。

© www.soinside.com 2019 - 2024. All rights reserved.