在构建映射特征字典后,如何更新它?
How do I update the dictionary of a mapped trait, after I've already constructed it?
我需要在初始特征创建后的某个时间更新映射特征的字典。
我该怎么做呢?
以下代码:
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:\Users\dbanas\Anaconda3\envs\pybert-dev\lib\site-packages\traits\trait_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()
注意: 注释掉的行是我试过的东西,没有工作。
我不确定我是否理解您的需求,但我可以提出一些建议:
如果同时允许 None
和 Dict
.,Either
是一个不错的选择
- 使用dynamic initialization 在运行时为特征创建一个值。最好使用
__init__
方法。
- 如果你真的需要一个
__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
只接受 None
或 Dict
。我的建议是仅在 class 级别将特征定义用于键入。在方法中,使用常规 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'}
如果需要在运行时计算,则使用dynamic initialization初始化值:
>>> class Bar(HasTraits):
... zap = Dict()
...
... def _zap_default(self):
... default = {}
... default[1] = 'a'
... return default
...
>>> bar_dynamic = Bar()
>>> bar_dynamic.zap
{1: 'a'}
无论哪种方式,Bar
实例上的 zap
属性在实例化 class 后(在 bar = Bar()
之后)就是一个常规字典。您应该在实例化后使用 Trait 类型,只能使用常规 Python 对象。 Traits 用于 定义和强制类型 。您要分配给类型化特征的对象的 type()
(如此处的 zap
)是常规 Python 类型。
这是从 class 外部修改 zap
的方法:
>>> bar.zap[2] = 'b'
>>> bar.zap
{5: 'e', 2: 'b'}
>>>
>>> bar_dynamic.zap[3] = 'c'
>>> bar_dynamic.zap
{1: 'a', 3: 'c'}
现在从 class 内部,作为 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'}
我需要在初始特征创建后的某个时间更新映射特征的字典。 我该怎么做呢? 以下代码:
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:\Users\dbanas\Anaconda3\envs\pybert-dev\lib\site-packages\traits\trait_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()
注意: 注释掉的行是我试过的东西,没有工作。
我不确定我是否理解您的需求,但我可以提出一些建议:
-
如果同时允许
Either
是一个不错的选择- 使用dynamic initialization 在运行时为特征创建一个值。最好使用
__init__
方法。 - 如果你真的需要一个
__init__
方法,你 必须 在其中调用super
才能使 Traits 正常工作,例如`super()init(*args, **kwargs)
None
和 Dict
.,这是您的代码版本,我认为它可以解决您的问题。
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
只接受 None
或 Dict
。我的建议是仅在 class 级别将特征定义用于键入。在方法中,使用常规 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'}
如果需要在运行时计算,则使用dynamic initialization初始化值:
>>> class Bar(HasTraits):
... zap = Dict()
...
... def _zap_default(self):
... default = {}
... default[1] = 'a'
... return default
...
>>> bar_dynamic = Bar()
>>> bar_dynamic.zap
{1: 'a'}
无论哪种方式,Bar
实例上的 zap
属性在实例化 class 后(在 bar = Bar()
之后)就是一个常规字典。您应该在实例化后使用 Trait 类型,只能使用常规 Python 对象。 Traits 用于 定义和强制类型 。您要分配给类型化特征的对象的 type()
(如此处的 zap
)是常规 Python 类型。
这是从 class 外部修改 zap
的方法:
>>> bar.zap[2] = 'b'
>>> bar.zap
{5: 'e', 2: 'b'}
>>>
>>> bar_dynamic.zap[3] = 'c'
>>> bar_dynamic.zap
{1: 'a', 3: 'c'}
现在从 class 内部,作为 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'}