具有默认选项的数据类参数选择

idl*_*dle 2 python field python-3.x python-3.7 python-dataclasses

我正在创建一个带有字段的数据类,我希望只有几个可能的值。我在想这样的事情:

@dataclass
class Person:
   name: str = field(default='Eric', choices=['Eric', 'John', 'Graham', 'Terry'])
Run Code Online (Sandbox Code Playgroud)

我知道一种解决方案是验证__post_init__方法中的参数,但是否有使用类似上述语法的更简洁的方法?

Arn*_*rne 5

python 3.8 引入了一种新类型Literal,可以在这里使用:

from dataclasses import dataclass
from typing import Literal

@dataclass
class Person:
    name: Literal['Eric', 'John', 'Graham', 'Terry'] = 'Eric'
Run Code Online (Sandbox Code Playgroud)

类型检查mypy器在正确解释它时没有问题,Person('John')通过,并被Person('Marc')标记为不兼容。请注意,这种提示需要类型检查器才能有用,当您只是运行代码时,它不会自行执行任何操作。

如果您使用的是较旧的 python 版本并且无法升级到 3.8,您还可以Literal通过官方 pip-installable backport package访问该类型typing-extensions,并使用它from typing_extensions import Literal来导入它。


如果您需要在运行时对传递的值进行实际检查,您应该考虑使用pydantic来定义您的数据类。它的主要目标是使用强大的验证引擎扩展类似数据类的结构,该引擎将检查类型提示以强制执行它们,即您认为在__post_init__.