Ви напевно знаєте такий тип змінних як 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
Звичайно в одному файлі так не напишете, але якщо це багатомодульна система, то досить легко завантажити в якийсь момент її по іншому і в результаті з'явиться помилка яку не так і легко знайти.
Надіюсь що ви не будете наступати на ці граблі, як я наступив )
