1

我想输入一个变量作为有效值的有限集列表。所以基本上,我希望有以下最小示例的打字等效项:

valid_parameters = ["value", "other value"]

def check_type(parameters_list):
    for parameter in parameters_list:
        if parameter not in valid_parameters:
            raise ValueError("invalid parameter")

valid_list = ["value"]
check_type(valid_list)
# work

invalid_list = ["different_value"]
check_type(invalid_list)
# raise error

我已经检查了打字,但我没有设法找到解决方案。我试图创建列表Literal,但它似乎没有工作。有这样的解决方案吗?可以创建吗?

4

1 回答 1

0

在运行时使用Literal将不起作用,类型提示旨在与类型检查器、IDE、linter 等一起使用。

因此,以下在运行时不会失败:

>>> from typing import Literal
>>> VALID = Literal["value", "other value"]
>>> def foo(my_param: VALID) -> None:
...     print(my_param)
... 
>>> foo("value")
value
>>> foo("bar")
bar

但是您可以使用 anEnum来实现您想要的:

>>> from enum import Enum
>>> class Parameter(Enum):
...     VALUE = "value"
...     OTHER_VALUE = "other value"
... 
>>> def foo(my_param: Parameter) -> None:
...     print(my_param)
...
>>> foo(Parameter("value"))
Parameter.VALUE
>>> foo(Parameter("wrong"))
ValueError: 'wrong' is not a valid Parameter

(这是在 Python 3.8.0 上测试的)

于 2021-02-18T12:42:59.837 回答