Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 1, 2014 22:06:31

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

Здравствуйте.
Имеется программка, в которой я хочу отслеживать изменения флагов. Флаги хранятся в словаре, и имеют различные типы (строки, логические, словари и т.п.)
Написал вот такую функцию:

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’
Как можно правильно отслеживать изменения словаря, с учетом того, что там могут быть любые типы данных?



Win7 + Python3.3 + PyScripter

Отредактировано admiral (Июнь 1, 2014 22:08:17)

Офлайн

#2 Июнь 1, 2014 22:52:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

admiral
Флаги хранятся в словаре, и имеют различные типы (строки, логические, словари и т.п.)
Флаги - это переключатели, их значения логические. Их вообще можно хранить в одной целочисленной переменной (с помощью побитовых операций).

admiral
Флаги хранятся в словаре
Эти объекты хранятся не в словаре.



Офлайн

#3 Июнь 2, 2014 12:53:02

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

Ну пусть не флаги… неважно как я назвал этот словарь…
По сути, как мне отслеживать изменения в данном словаре и выводить их в лог?



Win7 + Python3.3 + PyScripter

Офлайн

#4 Июнь 2, 2014 13:14:02

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

admiral
Как можно правильно отслеживать изменения словаря
Отнаследоваться от стандартного словаря, переопределить методы __setitem__, __delitem__, update, pop, popitem, setdefault таким образом, чтобы при изменении словаря происходило некое событие за которым Вы будете следить в своей программе.



Офлайн

#5 Июнь 2, 2014 14:48:27

mgk
Зарегистрирован: 2014-05-27
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

Ошибка где-то в другом месте. Ни одна строка из трейса

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
не совпадает с кодом из функции, которую ты привёл

Офлайн

#6 Июнь 2, 2014 17:42:35

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

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'
Все тоже самое.



Win7 + Python3.3 + PyScripter

Офлайн

#7 Июнь 2, 2014 17:43:19

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

FishHook
Отнаследоваться от стандартного словаря, переопределить методы __setitem__, __delitem__, update, pop, popitem, setdefault таким образом, чтобы при изменении словаря происходило некое событие за которым Вы будете следить в своей программе.
Я с классами не очень пока…. обычную функцию никак нельзя сделать?



Win7 + Python3.3 + PyScripter

Офлайн

#8 Июнь 2, 2014 18:44:53

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

admiral
Я с классами не очень пока…. обычную функцию никак нельзя сделать?
И что эта функция должна по твоему делать?



Офлайн

#9 Июнь 2, 2014 19:36:39

admiral
Зарегистрирован: 2013-12-23
Сообщения: 33
Репутация: +  0  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

FishHook
И что эта функция должна по твоему делать?
Функция должна крутиться в потоке и, к примеру, раз в секунду отслеживать что изменилось в словаре за эту секунду. И выводить эти изменения в лог-файл.
Конечно, ваше предложение намного лучше, так будут видны все изменения моментально… Но на изучение всего материала по классам уйдет много времени, а пока хотя бы так реализовать…

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



Win7 + Python3.3 + PyScripter

Отредактировано admiral (Июнь 2, 2014 19:38:19)

Офлайн

#10 Июнь 3, 2014 00:30:58

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Отслеживание изменений в словаре

admiral
неважно как я назвал этот словарь
Когда говоришь про словарь в питоне, это означает тип dict.

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

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

mgk
Ошибка где-то в другом месте. Ни одна строка из трейса
не совпадает с кодом из функции, которую ты привёл
Там просто объект какой-то с переопределённым __eq__, и автор называет его “словарём”.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version