想象一下,我有以下 Traits 对象:
from traits.api import Int, HasTraits, Instance
class Foo(HasTraits):
a = Int(2)
b = Int(5)
class Bar(HasTraits):
c = Int(7)
foo = Instance(Foo,())
Bar
a
将让我通过以下方式访问属性Foo
:
bar = Bar()
bar.foo.a
>>> 2
是否有一种标准方法可以bar
作为嵌套字典返回:
print bar_as_dict
>>> {'c':7, 'foo':{'a':2, 'b':5}}
我本质上是在尝试提取特定类型对象的所有子特征。我们的用例是我们有深度嵌套的具有绘图特征的 HasTrait 对象,并且我们正在尝试动态查找特定对象上的所有绘图。我们有一个函数可以从嵌套字典中返回绘图,但我们需要传入 HasTrait 对象,因此将它们格式化为嵌套字典会很棒。如果有另一种方法可以动态检查 HasTraits 对象的堆栈并返回某种类型的所有特征,那也可以。
这是 HasTraits API 的链接......无法直接从中弄清楚。
解决方案尝试
我试过使用该.traits()
方法,但它返回这些CTrait
对象。
print bar.traits()
>>>{'trait_added': <traits.traits.CTrait object at 0x8b7439c>,
'c': <traits.traits.CTrait object at 0x8b29e9c>,
'foo': <traits.traits.CTrait object at 0x8b29e44>,
'trait_modified': <traits.traits.CTrait object at 0x8b74344>}
没有像我预期的那样评估:
isinstance(bar.traits()['c'], int)
>>> False
但在彼得的建议之后,这行得通:
print bar.traits()['c'].is_trait_type(Int)
>>> True
现在的问题是如何递归地做到这一点。