Антипаттерн Python: нечистые(IO) аргументы по умолчанию
Одна из самых любимых особенностей функций python — это аргументы по умолчанию. Мы используем их
каждый день. Но есть одна загвоздка, о которой следует позаботиться.
Аргументы функции по умолчанию оцениваются во время загрузки модуля, а не во время вызова функции.
Это помогает улучшить производительность, если аргументы по умолчанию статичны и детерминированы.
Поэтому если ваша функция недетерминирована или имеет побочные эффекты, вы можете столкнуться с проблемами.
Как показано в примере, время печати заморожено; оно было установлено один раз, когда код был впервые оценен.
# Antitpattern and buggy
def current_datetime(dt = datetime.datetime.now()):
print(dt)
>>> current_datetime()
2021-10-09 16:09:43.009959
>>> current_datetime()
2021-10-09 16:09:43.009959
# do this instead
def current_datetime(dt=None) :
if dt is None :
dt = datetime.datetime.now()
print(dt)
current_datetime()
>> 2022-07-24 16:07:16.435203
current_datetime()
>> 2022-07-24 16:08:16.635203