在 Python 中键入提示特定字符串的列表[重复]

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

我有一个如下所示的功能:

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"])

应该可以正常工作,因为它们是定义的子集。

目前,使用上面的代码,它只接受任意字符串列表。

python string union type-hinting literals
1个回答
4
投票

如果您想将值限制为预定义的集合,您可能需要使用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.
© www.soinside.com 2019 - 2024. All rights reserved.