Ви напевно знаєте такий тип змінних як static, які містяться в функціях і їхнє значення зберігається між викликами функцій. Якщо згадувати пенсіонера С, то приклад буде такий:

function example1(void) { static int A = 1; A++; print('A = '+A); } example1(); >> A = 2 example1(); >> A = 3 example1(); >> A = 4

Думаю цей код працювати не буде через моє незнання С, але суть показує. І повертаючись до мого любимого Python'а - в ньому таких статичних методів в функціях немає, і замість того треба юзати класи: class S(object): a = 1 def example2(): S.a += 1 print "a = "%(S.a) example2() >> a = 2 example2() >> a = 3 example2() >> a = 4

Я постійно використовую таку функціональність, але незнав до недавнього часу особливість, що варта була декількох годин відладки коду. Отже, хай ви класи і їхні властивості будете використовувати як "ключ"(флажок) для неповторення функціоналу. Наприклад так: class S(object): was_run_example2 = False def example2() if not S.was_run_example2: print "PRINT ONLY ONE" example2() >> PRINT ONLY ONE example2() example2() example2()

Тепер ми прийшли до суті, мій модуль для логування в Пітоні використовує приблизно таку систему(хоча код набагато там кращий:) ), щоб налаштовувати логування лише раз. Але нещодавно виявилось, що почали дублюватися логи, тобто якимось чином ця система не працювала і код налаштування логування викликався 2 рази. Довго я не міг зрозуміти навіть приблизну причину, і тестував все методом "наукового тика" - постійно коментуючи різні участки кода і дивлячись чи було дублювання чи ні. Нарешті виявилось, що якщо цю функцію інклудити по різному в Пітоні, то для Пітона це буде два різні файли і різні обьєкти з різними значеннями полів обьєкту: include example2 from utils include example2 from project.utils include example2

Звичайно в одному файлі так не напишете, але якщо це багатомодульна система, то досить легко завантажити в якийсь момент її по іншому і в результаті з'явиться помилка яку не так і легко знайти.

Надіюсь що ви не будете наступати на ці граблі, як я наступив )

 
 
 
Роман Хоменко aka PresidentUA
mail/jabber: spirt40@gmail.com