Загрузка противоречивых данных в pymongo - PullRequest
0 голосов
/ 25 мая 2018

Я работаю с pymongo и хочу убедиться, что сохраненные данные могут быть загружены, даже если в схему были добавлены дополнительные элементы данных.

Я использовал это для классов, которым не нужно обрабатывать информацию перед присвоением ее атрибутам класса:

class MyClass(object):
    def __init__(self, instance_id):
        #set default values
        self.database_id = instance_id
        self.myvar = 0

        #load values from database
        self.__load()

    def __load(self):
        data_dict = Collection.find_one({"_id":self.database_id})
        for key, attribute in data_dict.items():
            self.__setattr__(key,attribute)

Однако в классах, из которых мне нужно обрабатывать данныебаза данных, это не работает:

class Example(object):
    def __init__(self, name):
        self.name = name
        self.database_id = None
        self.member_dict = {}

        self.load()

    def load(self):
        data_dict = Collection.find_one({"name":self.name})
        self.database_id = data_dict["_id"]
        for element in data_dict["element_list"]:
            self.process_element(element)
        for member_name, member_info in data_dict["member_class_dict"].items():
            self.member_dict[member_name] = MemberClass(member_info)

    def process_element(self, element):
        print("Do Stuff")

Два примера использования, которые у меня есть:

1) Список строк, которые используются для установки флагов, это делается путем вызова функциисо строкой в ​​качестве аргумента.(def process_element выше)

2) Словарь словарей, которые используются для создания списка экземпляров класса.(MemberClass(member_info) выше)

Я пытался создать свойства, чтобы справиться с этим, но обнаружил, что __setattr__ не ищет свойства.

Я знаю, что мог бы переопределить __setattr__, чтобы искать конкретныеимен, но я понимаю, что это замедлит все взаимодействия между множествами с классом, и я предпочел бы избежать этого.

Я также знаю, что мог бы использовать кучу попыток / исключений для отлова ошибок, но этоВ конечном итоге код становится очень громоздким.

Я не возражаю против того, чтобы функция загрузки немного замедлилась, но очень хочу избежать всего, что замедлит класс вне загрузки.

1 Ответ

0 голосов
/ 31 мая 2018

Таким образом, решение, которое я придумал, состоит в том, чтобы использовать идею изменения метода __setattr__, но вместо этого обрабатывать исключения в функции загрузки вместо __setattr__.

def load(self):
    data_dict = Collection.find_one({"name":self.name})

    for key, attribute in world_data.items():
        if key == "_id":
            self.database_id = attribute
        elif key == "element_list":
            for element in attribute:
                self.process_element(element)
        elif key == "member_class_dict":
            for member_name, member_info in attribute.items():
                self.member_dict[member_name] = MemberClass(member_info)
        else:
            self.__setattr__(key,attribute)

Thisпредоставляет все функции переопределения метода __setattr__ без замедления любых будущих вызовов на __setattr__ вне загрузки класса.

...