Любой объект Python может быть собран мусором, если на него больше нет ссылок. Например, после выполнения этого представления ...
def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback)
return HttpResponse('')
... больше нет ссылки на my_callback
, и сохраненный в нем объект функции может быть собран в любой момент. Вы можете сделать
all_my_callbacks = []
def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback)
all_my_callbacks.append(my_callback)
return HttpResponse('')
Теперь есть ссылка на объект функции обратного вызова даже после того, как представление отрендерено;это в all_my_callbacks
. В качестве альтернативы используйте сильную ссылку в сигнале с weak=False
:
def example_view(request):
def my_callback(*args, **kwargs):
print(args, kwargs)
some_signal.connect(my_callback, weak=False)
return HttpResponse('')
Вы можете и должны избегать всех этих хлопот, используя верхний уровень вместо локальных функций. Практически повсеместно так должен выглядеть ваш код :
def my_callback(*args, **kwargs):
print(args, kwargs)
def example_view(request):
some_signal.connect(my_callback)
return HttpResponse('')
Всегда есть ссылка на такую функцию, поэтому она никогда не собирается сборщиком мусора.