Как обновить словарь сопоставленной черты после того, как я уже сконструировал ее? - PullRequest
0 голосов
/ 22 сентября 2019

Мне нужно обновить словарь сопоставленной черты через некоторое время после создания первоначальной черты.Как мне это сделать?Следующий код:

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.```

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я не уверен, что понимаю, что вы ищете, но я могу дать несколько рекомендаций:

  1. Either - хороший выбор, если вы разрешите и None, и Dict.
  2. Используйте динамическую инициализацию , чтобы создать значение для черты во время выполнения.Рекомендуется использовать метод __init__.
  3. Если вам действительно нужен метод __init__, вы должны вызвать внутри него super, чтобы черты работали должным образом, например, `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.Я рекомендую использовать определения черт только для набора текста на уровне класса.Внутри методов используйте обычные типы 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()
0 голосов
/ 22 сентября 2019

Хорошо, сработал следующий код:

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()

Примечание: Закомментированные строки - это то, что я пробовал, что сработало , а не .

...