gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:35:36 26 4
gpt4 key购买 nike

我正在研究一个机械系统(例如,一个简单的斜齿轮),并希望防止用户分配在相关枚举中找不到的值。我对枚举和回答这个问题的“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?<
    • 如果您稍后创建另一个包含右手和左手项目的类(class)会怎么样?

小更正:您的 __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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com