Динамически устанавливать элементы dict с помощью getattr

Я уже вижу сообщение Динамически получать элементы dict через getattr?, но я могу не решить мою проблему.

Я хочу сделать что-то подобное, но я немного смущен. Я хочу установить (не получить) данные в соответствующем словаре, но получаю эту ошибку

AttributeError: объект типа «Словарь» не имеет атрибута «ГЛАГОЛЫ».

Мой код:

class Dictionary:
    def __init__(self):
        self.VERBS = dict()
        self.REFERENCER = dict()

   def setDictionary(self, fileDictionary, name):
        methodCaller = Dictionary()
        dictionary = "self."+name.upper()
        dictionary = getattr(Dictionary, name.upper())
        dictionary = fileDictionary.copy()

Вы видите, что я делаю неправильно? Потому что я совершенно этого не понимаю.


person benpay    schedule 02.12.2016    source источник
comment
Я думаю, что вы хотите сделать dictionary = getattr(methodCaller, name.upper()), но я не понимаю, чего именно вы хотите достичь.   -  person ettanany    schedule 02.12.2016
comment
Вы не указали, какая строка вызывает ошибку, не указали достаточно кода для воссоздания ошибки и желаемого результата/вывода.   -  person martineau    schedule 02.12.2016


Ответы (1)


Я думаю, что это то, что вы ищете:

class Dictionary:
    def __init__(self):
        self.VERBS = dict()
        self.REFERENCER = dict()

   def setDictionary(self, fileDictionary, name):
        setattr(self, name.upper(), fileDictionary)

Это использует setattr для назначения fileDictionary члену с именем name.upper() на self

Ошибка кода в вопросе возникает из-за попытки доступа к имени в классе, где оно не существует, а не в экземпляре, где оно существует.

Метод также можно записать так:

def setDictionary(self, fileDictionary, name):
    dictionary = getattr(self, name.upper())
    dictionary.update(fileDictionary)

Что может быть ближе к тому, что вы пытались.

Обратите внимание, что эти два параметра ведут себя по-разному, если переданный словарь изменен. Первый связывает объект с именем экземпляра. Второй обновляет существующий словарь элементами из переданного словаря.

person Dan D.    schedule 02.12.2016