функция python / django, возвращающая одинаковое значение каждый раз

#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. Только что увидел ваше имя, это мое имя, ЛоЛ.