помилка

Posted by admin

Ви напевно знаєте такий тип змінних як 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

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

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

 
 
 

Contacts

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

Creative Commons License