问题描述
我希望 Python 数据类中的字段只有某些可能的值。
例如,我想要一个 Jewel
数据类,其字段 material
只能接受值“gold”、“silver”和“platinum”。
我想出了这个解决方案:
@dataclass
class Jewel:
kind: str
material: str
def __post_init__(self):
ok_materials = ["gold","silver","platinum"]
if self.material not in ok_materials:
raise ValueError(f"Only available materials: {ok_materials}.")
因此,Jewel("earrings","silver")
可以,而 Jewel("earrings","plastic")
会引发 ValueError
。
有没有更好或更pythonic的方法来实现这一目标?也许依赖于数据类模块中的功能?
解决方法
这个场景正是 enum 的用途。
>>> from enum import Enum
>>> class Material(Enum):
... gold = 1
... silver = 2
... platinum = 3
...
>>> Material.diamond
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
File "C:\...\enum.py",line 341,in __getattr__
raise AttributeError(name) from None
AttributeError: diamond
>>> Material.gold
<Material.gold: 1>
,
- 您应该将 ok_materials 创建为一个集合。
- 根据 PEP-8,你应该把 not 放在 self.material 之前
- ok_materials 应该是一个类属性(至少从我对你的类的看法来看)
- 如果您不希望用户修改 ok_materials,您可以在开始处添加下划线。 就数据类的特殊性而言,我显然对这个类不够熟悉,无法给出答案。