Есть ли способ отслеживать измененные элементы словаря в python? - PullRequest
0 голосов
/ 11 июля 2020

У меня есть GUI, который читает файл JSON и создает другой виджет для каждого элемента в JSON, который содержит ключевое слово «ВАЖНО». Остальные элементы в JSON по-прежнему важны для программы, но не важны для пользователя. После чтения файла пользователь может добавить дополнительные виджеты или изменить существующие виджеты. Важно, чтобы порядок виджетов оставался прежним, а другие элементы в JSON тоже оставались на своих местах. Например:

ВАЖНО1 ВАЖНО2 не важно ВАЖНО3

может стать:

ВАЖНО1 ВАЖНО2 не важно ДОБАВЛЕНО ПОЛЬЗОВАТЕЛЕМ ВАЖНО3

Есть простой способ сохранить отслеживать, после какого элемента идет «неважный» элемент в JSON? Я подумал об использовании копии оригинального JSON, но, поскольку пользователи могут изменять виджеты, которые, в свою очередь, изменяют элементы JSON, трудно отслеживать, какой элемент начинался как какой элемент. Я также думал добавить еще один ключ к элементу JSON, но из-за того, для чего используется JSON, это невозможно. Любые идеи? Заранее спасибо!

1 Ответ

0 голосов
/ 11 июля 2020

Вы можете попробовать добавить уникальный идентификатор к элементам, который просто не отображается для пользователя, тогда позже вы сможете отслеживать элементы независимо от внесенных в них изменений. Если это не вариант, вы также можете попробовать найти элементы по значению ha sh.

Например, если вы знаете, что все элементы в списке не совсем идентичны, и что их содержимое не изменится из-за редактирования пользователем, вы можете сделать что-то вроде tuple(i for i in important_widget.items()), чтобы получить неизменяемую (и, следовательно, хешируемую) версию вашего виджета для сравнения с тем, что у вас было до редактирования пользователем.

Пример

data = {
    "some_value_buried_in_the_json": [
        {
            "is_important": True,
            "some_unique_data": 123,
            "user_cares_about": True
        },
        {
            "is_important": True,
            "some_unique_data": 999,
            "user_cares_about": True
        },
        {
            "is_important": True,
            "some_unique_data": 734,
            "user_cares_about": False
        },
        {
            "is_important": True,
            "some_unique_data": 678,
            "user_cares_about": True
        }
    ]
}

pre_unimportant_to_user_data = data['some_value_buried_in_the_json'][1]

# Simulate data being modified by user
data['some_value_buried_in_the_json'].insert(2, {'is_important': True, 'some_unique_data': 111, 'user_cares_about': True})

hashed_value = tuple(i for i in pre_unimportant_to_user_data.items())

for value in data['some_value_buried_in_the_json']:

    if tuple(i for i in value.items()) == hashed_value:

        print('found the previous entry')

Работает

$ python example.py 
found the previous entry
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...