我有一个可以采用固定值列表的函数:例如
def func(mode="a"):
if mode not in ["a", "b"]:
raise AttributeError("not ok")
Run Code Online (Sandbox Code Playgroud)
有没有办法输入提示它只能是这两个值之一?
我有一个只能返回的函数a,b或者c它们都属于类型,T但是我想将它的一部分签名这个事实,因为它们在函数的上下文中具有特殊含义,我是如何做到的?
目前我用这个
def fun(...) -> "a or b or c":
#briefly explain the meaning of a, b and c in its docstring
Run Code Online (Sandbox Code Playgroud)
那是正确的吗?
我知道我可以做到这一点
def fun(...) -> T:
#briefly explain the meaning of a, b and c in its docstring
Run Code Online (Sandbox Code Playgroud)
但正如我所说,我想在签名中表达该函数只返回那些特定的值
I have a function which validates its argument to accept only values from a given list of valid options. Typing-wise, I reflect this behavior using a Literal type alias, like so:
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}'
)
# ...
Run Code Online (Sandbox Code Playgroud)
这违反了 DRY 原则,因为我必须在我的 Literal 类型的定义中重写有效参数列表,即使它已经存储在变量 中VALID_ARGUMENTS。给定变量,如何Argument动态创建Literal 类型VALID_ARGUMENTS …
假设我需要运行时和类型提示的值列表:
from typing import Literal
valid_values = ('foo', 'bar', 'baz')
def f(arg: Literal[???]):
assert arg in valid_values
Run Code Online (Sandbox Code Playgroud)
是否可以以某种方式解压valid_values到Literal类型提示中,例如Literal[*valid_values](这是无效的语法)?重复这些值将不是最佳的。