我正在研究一个机械系统(例如,一个简单的斜齿轮),希望防止用户分配在关联枚举中找不到的值。我对enums和‘pythonic’方法不太熟悉,所以我的请求有两个方面:
在python中,让输入错误发生并使用后续代码来管理后果是否更合适?
枚举应该在使用它的类中定义吗?我不想让这个枚举在其他地方可用…我觉得奇怪的是,只是让它在我的文件开头。
代码如下:

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

最佳答案

错误处理应尽可能靠近错误的来源。因此,无论用户是在中输入数据,还是函数/类接受数据,都应该立即检查和处理这些数据。
在哪里定义枚举完全取决于您,但我倾向于将它们放在顶层,原因如下:
需要使用它们的其他代码: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/

10-11 02:06