我有一个如下所示的函数:
from typing import List, Literal, Union
def foo(possible_values: List[Union[Literal['abcd', 'efgh', 'ijkl']]]):
return {}
现在这就是我希望代码的行为方式:
每当 possible_values
参数获取除 ["abcd", "efgh","ijkl"]
以外的值时
例如:
res = foo(possible_values=["abc", "efgh"])
它应该抛出错误,因为函数签名中未定义 abc
。
但是,
res = foo(possible_values=["abcd", "efgh"])
应该可以正常工作,因为它们是定义的子集。
目前,使用上面的代码,它只接受任意字符串列表。
最佳答案
如果您想将值限制为预定义的集合,您可能需要使用 Enum 。就像其他人提到的那样,类型提示不会在 python 中本地强制执行检查和错误,您必须在函数的代码中实现它,或者使用允许基于注释的控制的库。这是一个例子。
from typing import List
from enum import Enum
# Let's define your possible values as an enumeration. Note that it also inherits from
# str, which will allow to use its members in comparisons as if they were strings
class PossibleValues(str, Enum):
abcd = 'abcd'
efgh = 'efgh'
ijkl = 'ijkl'
现在你的函数。请注意类型提示。
def foo(possible_values: List[PossibleValues]):
# We unroll the enum as a set, and check that possible_values is a subset of it
if not set(PossibleValues).issuperset(possible_values):
raise ValueError(f'Only {[v.value for v in PossibleValues]} are allowed.')
# Do whatever you need to do
return {}
现在当你使用它时:
foo(['abcd', 'efgh'])
# output: {}
foo(['abc', 'efgh'])
# ValueError: Only ['abcd', 'efgh', 'ijkl'] are allowed.
关于python - Python 中的类型提示特定字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72359579/