我正在研究一个机械系统(例如,一个简单的斜齿轮),希望防止用户分配在关联枚举中找不到的值。我对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/