#python #django
#python #django
Вопрос:
У меня есть функция, которая выглядит следующим образом:
def getCurrentShow(hour=(localtime().tm_hour),day=datetime.datetime.now().strftime('%A')):
return Schedule.objects.get(hour=hour,day=day).show
поэтому я могу вызывать ее с указанием времени или дня или без него. Моя проблема в том, что когда я вызываю ее без аргументов, ie:
print getCurrentShow()
Она всегда возвращает один и тот же объект при запуске из одного и того же экземпляра python (например, если у меня запущена оболочка python, и я жду час и запускаю новую оболочку, не выходя из старой, я могу запустить ее и получить разные результаты между оболочками (или веб-сервером), но функция всегда возвращает одно и то же значение один раз в одной и той же оболочке).
Я предполагаю, что python каким-то образом кэширует результаты функций, вызываемых без аргументов? любой способ обойти это, не переписывая все мои вызовы getCurrentShow на что-то вроде
Schedule.objects.get(hour=(localtime().tm_hour),day=datetime.datetime.now().strftime('%A')).show
?
Спасибо.
Ответ №1:
Значения по умолчанию для аргументов вашей функции вычисляются при первой загрузке функции интерпретатором. Что вы хотите, так это следующее:
def getCurrentShow(hour=None, day=None):
hour = hour or localtime().tm_hour
day = day or datetime.datetime.now().strftime('%A')
return Schedule.objects.get(hour=hour, day=day).show
Способ, которым это работает, заключается в том, что or
оператор возвращает первый операнд, который bool(operand) != False
. Пример:
>>> None or 5
5
>>> None or datetime.now()
datetime.datetime(2011, 6, 6, 11, 25, 46, 568186)
>>> 10 or datetime.now()
10
Таким образом, вы можете задать значение по умолчанию для своих аргументов None
, и они будут по умолчанию равны текущему времени, или вызывающий объект может передать свое собственное значение, которое переопределит значение по умолчанию.
Комментарии:
1. Спасибо, что так быстро! Похоже, что пока это работает, я дам вам знать через 15 минут, если это решит проблему полностью! P.s. Только что увидел ваше имя, это мое имя, ЛоЛ.