Найти - Пользователи
Полная версия: Отслеживание изменений в словаре
Начало » Python для новичков » Отслеживание изменений в словаре
1 2
admiral
Здравствуйте.
Имеется программка, в которой я хочу отслеживать изменения флагов. Флаги хранятся в словаре, и имеют различные типы (строки, логические, словари и т.п.)
Написал вот такую функцию:
def search_changes_flags_always():
    flags = copy.deepcopy(FLAGS)
    while True:
        try:
            for i in flags:
                if flags[i] != FLAGS[i]:
                    logger.info("Изменения: " + str(i) + ": " + str(FLAGS[i]))
                    flags[i] = FLAGS[i]
        except Exception:
            logger.info("Изменения - неизвестное исключение")
            log_to_file_exception()
        time.sleep(1)
Запихнул ее в поток. Но, она на строковых элементах ругается вот так:
if flags != FLAGS:
File “C:\Python33\lib\site-packages\selenium\webdriver\remote\webelement.py”, line 209, in __eq__
if self._id == element.id:
AttributeError: ‘str’ object has no attribute ‘id’
Как можно правильно отслеживать изменения словаря, с учетом того, что там могут быть любые типы данных?
py.user.next
admiral
Флаги хранятся в словаре, и имеют различные типы (строки, логические, словари и т.п.)
Флаги - это переключатели, их значения логические. Их вообще можно хранить в одной целочисленной переменной (с помощью побитовых операций).

admiral
Флаги хранятся в словаре
Эти объекты хранятся не в словаре.
admiral
Ну пусть не флаги… неважно как я назвал этот словарь…
По сути, как мне отслеживать изменения в данном словаре и выводить их в лог?
FishHook
admiral
Как можно правильно отслеживать изменения словаря
Отнаследоваться от стандартного словаря, переопределить методы __setitem__, __delitem__, update, pop, popitem, setdefault таким образом, чтобы при изменении словаря происходило некое событие за которым Вы будете следить в своей программе.
mgk
Ошибка где-то в другом месте. Ни одна строка из трейса
if flags != FLAGS:
File C:\Python33\lib\site-packages\selenium\webdriver\remote\webelement.py, line 209, in __eq__
if self._id == element.id:
AttributeError: str object has no attribute id
не совпадает с кодом из функции, которую ты привёл
admiral
mgk
Ошибка где-то в другом месте. Ни одна строка из трейса
Сейчас запустил скрипт, вот что в логи написало:
2014-06-02 17:40:01,877 - INFO - Изменения - неизвестное исключение
2014-06-02 17:40:01,885 - ERROR - 
Traceback (most recent call last):
  File "D:\_Admiral\Dropbox\Polka\ver3\slovar.py", line 1192, in search_changes_flags_always
    if flags[i] != FLAGS[i]:
  File "C:\Python33\lib\site-packages\selenium\webdriver\remote\webelement.py", line 209, in __eq__
    if self._id == element.id:
AttributeError: 'str' object has no attribute 'id'
Все тоже самое.
admiral
FishHook
Отнаследоваться от стандартного словаря, переопределить методы __setitem__, __delitem__, update, pop, popitem, setdefault таким образом, чтобы при изменении словаря происходило некое событие за которым Вы будете следить в своей программе.
Я с классами не очень пока…. обычную функцию никак нельзя сделать?
FishHook
admiral
Я с классами не очень пока…. обычную функцию никак нельзя сделать?
И что эта функция должна по твоему делать?
admiral
FishHook
И что эта функция должна по твоему делать?
Функция должна крутиться в потоке и, к примеру, раз в секунду отслеживать что изменилось в словаре за эту секунду. И выводить эти изменения в лог-файл.
Конечно, ваше предложение намного лучше, так будут видны все изменения моментально… Но на изучение всего материала по классам уйдет много времени, а пока хотя бы так реализовать…

Или… расскажите на пальцах КАК это сделать… Хотя бы примерчик.
Но нужно, что бы остальные функции “не заметили” изменений. т.е. что бы работали как с обычным словарем.
py.user.next
admiral
неважно как я назвал этот словарь
Когда говоришь про словарь в питоне, это означает тип dict.

admiral
if self._id == element.id:
Эта строка никакого отношения к типу dict не имеет.

admiral
По сути, как мне отслеживать изменения в данном словаре
Непонятно, что ты называешь словарём.

mgk
Ошибка где-то в другом месте. Ни одна строка из трейса
не совпадает с кодом из функции, которую ты привёл
Там просто объект какой-то с переопределённым __eq__, и автор называет его “словарём”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB