Ошибка при использовании имени функции в качестве переменной в Pycharm, Python, Django: локальная переменная «обработана», на которую ссылаются перед присваиванием - PullRequest
0 голосов
/ 25 сентября 2019

Я использую Pycharm Professional 2019.2, Python 3.7.4, Django 2.2.5.Как я знаю, имена функций являются глобальными переменными в модулях.Но у меня есть функция, которая это отрицает.

def processed(request):
    if request.method == 'post':
        text = request.post['text']
        processed = text.upper()
    return HttpResponse(processed)

Браузер показывает следующую ошибку:

UnboundLocalError at /process/
local variable 'processed' referenced before assignment
Request Method: POST
Request URL:    http://127.0.0.1:8000/process/
Django Version: 2.2.5
Exception Type: UnboundLocalError
Exception Value:    
local variable 'processed' referenced before assignment

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Одним из простых решений является:

def processed(request):
    # Do not use the function name as the parameter name.
    ret = processed

    # It should be 'POST', not 'post'.
    if request.method == 'POST':
        # It should be 'POST', not 'post'.
        text = request.POST['text']
        ret = text.upper()

    return HttpResponse(ret)
0 голосов
/ 25 сентября 2019

Проблема решена.Большое спасибо Dipen Dadhaniya , я использовал просто 'POST' вместо 'post', и ошибка исчезла.Как я упоминал ранее, имена функций являются глобальными, и нет проблем с их использованием в качестве переменной для хранения и возврата значения.Таким образом, окончательный код будет выглядеть так:

def processed(request):
    if request.method == 'POST':
        text = request.POST['text']
        processed = text.upper()
return HttpResponse(processed)

Не было проблем с переменными.Это было просто «ПОЧТА».Некоторая часть ответа Дипен-Дадхании была правильной.

0 голосов
/ 25 сентября 2019

Причина более интересна. Сначала processed является ссылкой на функцию, здесь вы можете выбрать другое имя.Да, это должно быть if request.method == "POST" заглавными буквами для соответствия, оно не соответствует условию

Но, что интересно, он должен был вернуть ссылку на функцию, но ошибка здесь UnboundError

Попробуйте этот фрагмент кода

def foo(bar): 
    return foo

print(foo(2)) #it will print function reference but not unbound

с другой стороны

def foo(bar): 
    if bar == 5:
       foo = 7
    return foo
print(foo(2)) #it will raise the `UnboundError` even if condition is never going to meet

Причина Абстрактное синтаксическое дерево сборка Python при определении функции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...