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

Python数据类:检查字段是否在可能值列表中,python,python-dataclasses,python-class,Python,Python Dataclasses,Python Class,我希望Python数据类中的字段仅具有某些可能的值。 例如,我想要一个Jeweldataclass,其字段material只能接受值“gold”、“silver”和“platinum”。 我提出了这个解决方案: @dataclass 珠宝类: 种类:str 材料:str 定义后初始化(自): ok_材料=[“金”、“银”、“铂”] 如果自材料不在ok_材料中: raise VALUERROR(f“仅可用材料:{ok_materials}.” 因此,珠宝(“耳环”、“银色”)就可以了,而珠宝(“

我希望Python数据类中的字段仅具有某些可能的值。 例如,我想要一个
Jewel
dataclass,其字段
material
只能接受值“gold”、“silver”和“platinum”。 我提出了这个解决方案:

@dataclass
珠宝类:
种类:str
材料:str
定义后初始化(自):
ok_材料=[“金”、“银”、“铂”]
如果自材料不在ok_材料中:
raise VALUERROR(f“仅可用材料:{ok_materials}.”
因此,
珠宝(“耳环”、“银色”)
就可以了,而
珠宝(“耳环”、“塑料”)
会引发
值错误

有没有更好的或者更像蟒蛇的方法来实现这一点?可能是依赖于数据类模块的特性的东西

  • 您应该将ok_材质创建为一个集合
  • 根据PEP-8,你应该把不在自我之前的材料
  • ok_材质应该是一个类属性(至少从我对您的类的了解来看)
  • 如果您不希望用户修改ok_材质,可以在下方加下划线。 就数据类的特殊性而言,我显然对这个类不够熟悉,无法给出答案

  • 这个场景正是s的目的

    >>> 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
    ...     银=2
    ...     铂金=3
    ...
    >>>材料.钻石
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    文件“C:\…\enum.py”,第341行,位于\uu getattr中__
    从“无”提升AttributeError(名称)
    属性错误:钻石
    >>>材料,黄金