python - 在Python中使用枚举来检查类/实例的属性

标签 python enums

我正在研究机械系统(例如,简单的斜齿轮),并希望防止用户分配关联枚举中未找到的值。我对回答这个问题的枚举和“Pythonic”方法很陌生......所以我的要求有两个:

  1. 在 python 中,让输入错误发生并使用后续代码来管理后果是否更合适?
  2. 枚举应该在使用它的类中定义吗?我不打算让这个枚举在其他地方可用...我觉得让它卡在我的文件开头很奇怪。

代码如下:

HAND = Enum('HAND', ['LH', 'RH'])


class HelicalGear(Gear):
    def __init__(self, hand):
        self.type_ = 'Helical'
        self.hand = hand

    @property
    def hand(self):
        return self._hand

    @hand.setter
    def hand(self, hand):
        if not hand:
            raise ValueError("Gear hand definition required")
        elif hand not in [e.name for e in HAND]:
            raise ValueError("Gear hand must be LH or RH")

        self._hand = hand

最佳答案

  1. 错误处理应该尽可能靠近错误的根源。因此,无论用户正在输入数据还是函数/类正在接受数据,都应该立即检查并处理该数据。

  2. 定义枚举的位置完全取决于您,但出于以下几个原因,我倾向于将它们保留在顶层:

    • 需要使用它们的其他代码:
      somemod.HAND.LH
      somemod.HelicalGear.HAND.LH?<
    • 如果您稍后创建另一个包含右手和左手项目的类怎么办?

小修正:你的__init__应该设置self._hand正如MisterMiyagi评论的:使用hand代替_hand 的优点是 hand.setter 中的错误检测代码。

在你的setter代码中我会做类似的事情:

@hand.setter
def hand(self, hand):
    if hand in HAND:
        # already an Enum, pass
        pass
    elif hand in HAND.__members__:
        # it's the name of a hand
        hand = HAND[hand]
    else:
        # numeric?
        hand = HAND(hand)
        # if not, a ValueError will be raised:
        # `ValueError: 0 is not a valid Hand`
    # save the Enum value
    self._hand = hand  # or hand.value or hand.name depending on what you want
                       # returned when HelicalGear.hand is accessed

关于python - 在Python中使用枚举来检查类/实例的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38086215/

相关文章:

python - Django查找文件路径问题

python - seaborn color_palette 作为 matplotlib 颜色图

c# - 将枚举转换为整数

c++ - 无法使用在模板化基类 [C++] 中声明的枚举来编译代码

python - 创建新实例时,python中的类变量是否会再次声明?

java - jython 无法列出错误

python - 无法导入scrapy包

java - 比较枚举条目 - Java

java - 使用 Enum 来检查条件

swift - 更改枚举 Swift 的关联值