кеш уровня модуля django - PullRequest
       18

кеш уровня модуля django

0 голосов
/ 22 ноября 2011

Я пытаюсь сохранить значение в переменной уровня модуля для последующего извлечения. Эта функция при вызове методом GET выдает эту ошибку: local variable 'ICS_CACHE' referenced before assignment

Что я здесь не так делаю?

ICS_CACHE = None
def ical_feed(request):
    if request.method == "POST":
        response = HttpResponse(request.POST['file_contents'], content_type='text/calendar')
        response['Content-Disposition'] = 'attachment; filename=%s' % request.POST['file_name']
        ICS_CACHE = response
        return response
    elif request.method == "GET":
        return ICS_CACHE

    raise Http404

Я создал базовый пример, чтобы увидеть, может ли функция читать константы модуля, и она работает просто отлично:

x = 5

def f():
    print x

f()

---> "5"

1 Ответ

1 голос
/ 22 ноября 2011

Добавить

global ISC_CACHE

как первая строка вашей функции. Вы присваиваете ему значение внутри тела функции, поэтому python предполагает, что это локальная переменная. Однако, как локальная переменная, вы не можете вернуть ее, не присвоив ей сначала.

Оператор global сообщает парсеру, что переменная находится вне области действия функции, поэтому вы можете вернуть ее значение.

В ответ на ваш второй опубликованный пример вы увидите, как анализатор работает с глобальными переменными, когда вы не пытаетесь их назначить.

Это может прояснить ситуацию:

x = 5 # global scope
def f():
    print x # This must be global, since it is never assigned in this function

>>> f()
5

def g():
    x = 6 # This is a local variable, since we're assigning to it here
    print x

>>> g()
6

def h():
    print x # Python will parse this as a local variable, since it is assigned to below
    x = 7

>>> h()
UnboundLocalError: local variable 'x' referenced before assignment


def i():
    global x # Now we're making this a global variable, explicitly
    print x
    x = 8 # This is the global x, too

>>> x # Print the global x
5
>>> i()
5
>>> x # What is the global x now?
8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...