Python 数据类:检查字段是否在可能值列表中

问题描述

我希望 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>
,
  1. 您应该将 ok_materials 创建为一个集合。
  2. 根据 PEP-8,你应该把 not 放在 self.material 之前
  3. ok_materials 应该是一个类属性(至少从我对你的类的看法来看)
  4. 如果您不希望用户修改 ok_materials,您可以在开始处添加下划线。 就数据类的特殊性而言,我显然对这个类不够熟悉,无法给出答案。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...