python - Python 中的类型提示特定字符​​串列表

标签 python string union type-hinting literals

我有一个如下所示的函数:

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/

相关文章:

MySQL 如果存在则从表中抓取,否则使用不同的表

python - 如何扩展/展开 Pandas Dataframe?

c++ - 尝试将字符串作为类的参数传递,但在 C++ 中它被识别为字符数组

arrays - 删除使用 union 以外的一系列行的更快方法

mysql - 将两个表中的mysql数据合并到一个数据集中并更新

java - 将字符串拆分为几个两个字符串

python - 如何将一个系列分配给另一个系列或在索引不相交的情况下合并并保留其中一个系列中感兴趣的索引的值

使用属性装饰器的 Python 只读列表

python - tensorflow 中的谱范数 2x2 矩阵

javascript - 如何转义存储颜色名称的 Less 变量中的引号?