我正在研究机械系统(例如,简单的斜齿轮),并希望防止用户分配关联枚举中未找到的值。我对回答这个问题的枚举和“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
?< - 如果您稍后创建另一个包含右手和左手项目的类怎么办?
- 需要使用它们的其他代码:
小修正:你的正如MisterMiyagi评论的:使用__init__
应该设置self._hand
。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/