特征枚举值

4 投票
1 回答
1573 浏览
提问于 2025-04-18 14:29

我在一个类里设置枚举值的时候遇到了一些麻烦...

如果我在iPython窗口里:

eTest = Enum('zero', 'one', 'two', 'three')

我可以这样做:

eTest.value = eTest.values[2]

然后用 print eTest.value 可以得到正确的答案:二

我在一个Python类里尝试同样的事情,但它告诉我:

AttributeError: 'str' object has no attribute 'values'

我该怎么做才能把eTest设置为枚举的[3]值,而不需要输入'三'这个词呢?

1 个回答

8

你不能这样使用 Enum 对象。Enum 对象其实是一种声明方式,它告诉 HasTraits 类,拥有这些枚举的地方要创建一个实例属性,这个属性会进行特定的验证。这个实例属性不会是一个 Enum 对象,而是枚举中定义的某个值。你之前在 Enum 对象上修改的 .value 属性只是改变了默认值,这并不是你在对象的生命周期中设置的东西。

from traits.api import Enum, HasTraits, TraitError


ETEST_VALUES = ['zero', 'one', 'two', 'three']


class Foo(HasTraits):
    eTest = Enum(*ETEST_VALUES)


f = Foo()
assert f.eTest == 'zero'
f.eTest = 'one'
f.eTest = ETEST_VALUES[3]

try:
    f.eTest = 'four'
except TraitError:
    print 'Oops! Bad value!'

我怎么才能让 eTest 拥有枚举中的 [3] 值,而不需要输入 'three' 这个词呢?

你可以参考我上面的例子,把列表和 Enum() 调用分开,当需要的时候直接索引这个列表就可以了。

撰写回答