在构建映射特征后,如何更新该词典?



我需要在初始特征创建后的一段时间内更新映射特征的字典。 我该怎么做? 以下代码:

from traits.api import (HasTraits, Trait)
class bar(HasTraits):
zap = Trait("None", {"None": None})
def __init__(self):
# In reality, determined programmatically at runtime.
add_dict_entries = {"One": 1}
new_dict = {"None": None}
new_dict.update(add_dict_entries)
self.zap = Trait("None", new_dict)
theBar = bar()

收益 率:

Traceback (most recent call last):
File "tst_mapped_trait.py", line 13, in <module>
theBar = bar()
File "tst_mapped_trait.py", line 11, in __init__
self.zap = Trait("None", new_dict)
File "C:UsersdbanasAnaconda3envspybert-devlibsite-packagestraitstrait_handlers.py", line 236, in error
object, name, self.full_info(object, name, value), value
traits.trait_errors.TraitError: The 'zap' trait of a bar instance must be 'None', but a value of <traits.traits.CTrait object at 0x00000000034AA9E8> <class 'traits.traits.CTrait'> was specified.```

好的,以下代码有效:

from traits.api import (HasTraits, Trait)
class bar(HasTraits):
zap = Trait("None", {"None": None})
def __init__(self):
# In reality, determined programmatically at runtime.
add_dict_entries = {"One": 1}
new_dict = {"None": None}
new_dict.update(add_dict_entries)
# self.zap = Trait("None", new_dict)
# self.zap.update(new_dict)
# self.trait_setq(zap=Trait("None", new_dict))
self.remove_trait("zap")
self.add_trait("zap", Trait("None", new_dict))
theBar = bar()

注意:注释掉的行是我尝试过的东西,但没有奏效

我不确定我是否理解您的目标,但我可以提出一些建议:

  1. 如果您同时允许NoneDictEither在这里是一个不错的选择。
  2. 使用动态初始化在运行时为特征创建值。最好使用__init__方法。
  3. 如果你真的需要一个__init__方法,你必须在其中调用super才能使 Traits 正常工作,例如 'super((init(*args, **kwargs(

这是您的代码的一个有效版本,我认为可以解决您的问题。

from traits.api import (HasTraits, Either, Dict)
class bar(HasTraits):
zap = Either(None, Dict)
def _zap_default(self):
add_dict_entries = {"One": 1}
new_dict = {"None": None}
new_dict.update(add_dict_entries)
return new_dict
theBar = bar()
print(theBar.zap)

以下是对不起作用的代码的一些反馈。下面self.zap = Trait("None", new_dict)行不起作用,因为它尝试创建Trait对象,但self.zap只接受NoneDict。我的建议是仅在类级别将特征定义用于键入。在方法中,使用常规的 Python 类型。

from traits.api import (HasTraits, Trait)
class bar(HasTraits):
zap = Trait("None", {"None": None})
def __init__(self):
# In reality, determined programmatically at runtime.
add_dict_entries = {"One": 1}
new_dict = {"None": None}
new_dict.update(add_dict_entries)
self.zap = Trait("None", new_dict)
theBar = bar()

这是第二次尝试回答原始海报的评论

如果您希望zap的类型Dict并且仅Dict,请将其定义为 。如果初始值在运行时不必是计算机,也可以内联该值:

>>> from traits.api import HasTraits, Dict
>>> class Bar(HasTraits):
...     zap = Dict({5: 'e'})
...
>>> bar = Bar()
>>> bar.zap
{5: 'e'}

如果需要在运行时计算,则使用动态初始化来初始化该值:

>>> class Bar(HasTraits):
...     zap = Dict()
...
...     def _zap_default(self):
...         default = {}
...         default[1] = 'a'
...         return default
...
>>> bar_dynamic = Bar()
>>> bar_dynamic.zap
{1: 'a'}

无论哪种方式,一旦类实例化(在bar = Bar()之后(,Bar实例上的zap属性就是一个常规字典。实例化后应使用 Trait 类型,仅使用常规 Python 对象。特征用于定义和强制实施类型。分配给类型化特征的对象type()(如此处zap(是常规 Python 类型。

以下是从类外部修改zap的方法:

>>> bar.zap[2] = 'b'
>>> bar.zap
{5: 'e', 2: 'b'}
>>>
>>> bar_dynamic.zap[3] = 'c'
>>> bar_dynamic.zap
{1: 'a', 3: 'c'}

现在从类内部,作为self的常规属性:

>>> class Bar(HasTraits):
...     zap = Dict()
...
...     def _zap_default(self):
...         default = {}
...         default[1] = 'a'
...         return default
...
...     def add_pair(self, key, value):
...         self.zap[key] = value
...
>>> bar_method = Bar()
>>> bar_method.zap
{1: 'a'}
>>> bar_method.add_pair(26, 'z')
>>> bar_method.zap
{1: 'a', 26: 'z'}

最新更新