gpt4 book ai didi

Python 输入 : Dynamically Create Literal Alias from List of Valid Values

转载 作者:行者123 更新时间:2023-12-04 11:07:39 24 4
gpt4 key购买 nike

我有一个函数来验证它的参数以只接受给定的有效选项列表中的值。在打字方面,我使用 Literal 反射(reflect)了这种行为。输入别名,如下所示:

from typing import Literal


VALID_ARGUMENTS = ['foo', 'bar']

Argument = Literal['foo', 'bar']


def func(argument: 'Argument') -> None:
if argument not in VALID_ARGUMENTS:
raise ValueError(
f'argument must be one of {VALID_ARGUMENTS}'
)
# ...
这违反了 DRY 原则,因为我必须在我的 Literal 类型定义中重写有效参数列表,即使它已经存储在变量 VALID_ARGUMENTS 中。 . 我如何创建 Argument给定 VALID_ARGUMENTS 动态的文字类型多变的?
以下事情不起作用:
from typing import Literal, Union, NewType


Argument = Literal[*VALID_ARGUMENTS] # SyntaxError: invalid syntax

Argument = Literal[VALID_ARGUMENTS] # Parameters to generic types must be types

Argument = Literal[Union[VALID_ARGUMENTS]] # TypeError: Union[arg, ...]: each arg must be a type. Got ['foo', 'bar'].

Argument = NewType(
'Argument',
Union[
Literal[valid_argument]
for valid_argument in VALID_ARGUMENTS
]
) # Expected type 'Type[_T]', got 'list' instead
那么,如何做到呢?还是根本就做不到?

最佳答案

反过来,构建 VALID_ARGUMENTS来自 Argument :

Argument = typing.Literal['foo', 'bar']
VALID_ARGUMENTS: typing.Tuple[Argument, ...] = typing.get_args(Argument)
可以在运行时构建 Argument来自 VALID_ARGUMENTS ,但这样做与静态分析不兼容,静态分析是类型注释的主要用例。大厦 VALID_ARGUMENTS来自 Argument是要走的路。
我为 VALID_ARGUMENTS 使用了一个元组在这里,但如果由于某种原因你真的更喜欢一个列表,你可以得到一个:
VALID_ARGUMENTS: typing.List[Argument] = list(typing.get_args(Argument))

关于Python 输入 : Dynamically Create Literal Alias from List of Valid Values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64522040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com