AttributeError:'TraitCompound'对象没有属性'clone'

问题描述 投票:2回答:1

假设我想使用Traits包创建一个“ bases”属性,该属性可以是“ none”字符串或具有“ hrf”或“ fourier”或“ fourier_han”或“ gamma”键的字典。 “ fir”,值是字典,键是“派生”或“ length”或“ order”,值是列表或浮点数)。例如:

bases =='none'要么基数== {'hrf':{'派生':[0,0]}}要么bases == {'fourier':{'length':1.4,'order':3}}}

如果我定义了一个'none'字符串或字典,其键为'hrf'或'fourier'或'fourier_han'或'gamma'或'fir',其值是字典的键为'driv'的键或'length'或'order'并使用列表中的值)可以正常工作:

>>> import traits.api as traits
>>> class Foo(traits.HasTraits):
...  bases = traits.Either(traits.Dict(traits.Enum("hrf","fourier","fourier_han","gamma","fir"),traits.Dict(traits.Enum("derivs","length","order"), traits.List)),'none',default={"hrf":{"derivs":[0,0]}})
... 
>>> foo=Foo()
>>> foo.bases
{'hrf': {'derivs': [0, 0]}}

但这不是我想要的。如果现在我尝试允许在内部字典中使用列表或浮点数,则它不起作用:

 >>> import traits.api as traits
 >>> class Foo(traits.HasTraits):
...  bases = traits.Either(traits.Dict(traits.Enum("hrf","fourier","fourier_han","gamma","fir"),traits.Dict(traits.Enum("derivs","length","order"), traits.Either(traits.List, traits.Float))),'none',default={"hrf":{"derivs":[0,0]}})
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in Foo
  File "/home/econdami/.local/lib/python3.7/site-packages/traits/trait_types.py", line 2804, in __init__
    handler = handler.clone()
AttributeError: 'TraitCompound' object has no attribute 'clone'

为什么?

python enthought
1个回答
0
投票

这不是我第一次与开发Traits项目的团队互动。

As always, they very quickly managed to solve the problem and gave a very detailed answer on it.

简而言之,一方面早于Traits 6.1,更喜欢:

traits.Union(traits.Float, traits.List)

to

traits.Either(traits.Float, traits.List)

另一方面,请注意Union()的default_value参数(Either()的default)。最好通过其他方式进行初始化。

© www.soinside.com 2019 - 2024. All rights reserved.