При вводе кода в функцию появляется "Локальная переменная, на которую ссылаются перед присваиванием"

Мой код работает нормально, пока я не попробую поместить его в функцию. После определения функции, отступа кода и вызова функции я получаю сообщение об ошибке "Локальная переменная print", на которую ссылаются перед присваиванием. Почему это происходит, когда все, что я изменяю, помещает его в функцию? назначьте переменную "печать". Пожалуйста, помогите! Я заблокировал токен для доступа к серверу, к которому я пытаюсь обратиться в целях безопасности.

def printSet():
    for user in range (0,len(parsed_json['members'])-1):
        userDict=parsed_json['members'][user]#Catches errors resulting from users not having all settings configured
        try:
            print("id: "+userDict["id"])
        except KeyError:
            print("No ID found")
        try:
            print("team id: "+userDict["team_id"])
        except KeyError:
            print("No team ID found")
        try:
            print("name: "+userDict["name"])
        except KeyError:
            print("No name found")
        try:
            print("real name: "+userDict["real_name"])
        except KeyError:
            print("No real name found")
        userProf=userDict['profile']
        try:
            print("title: "+userProf["title"])
        except KeyError:
            print("No title found")
        try:
            print("real name: "+userProf["real_name"])
        except KeyError:
            print("No real name found")
        try:
            print("real name normalized: "+userProf["real_name_normalized"])
        except KeyError:
            print("No real name normalized found")
        try:
            print("display name: "+userProf["display_name"])
        except KeyError:
            print("No display name found")
        try:
            print("display name normalized: "+userProf["display_name_normalized"])
        except KeyError:
             print("No display name normalized found")
        try:
            print("email: "+userProf["email"])
        except KeyError:
            print:("No email found")
        try:
            print("first name: "+userProf["first_name"])
        except KeyError:
            print("No first name found")
        try:
            print("last name: "+userProf["last_name"])
        except KeyError:
            print("No last name found")
#To easily show when one member ends and another begins
        print("----------------------------------")
printSet()

2 ответа

Решение

Я никогда не назначаю переменную "печать".

Да, вы делаете:

print:("No email found")

Это аннотированный оператор присваивания, который аннотирует print с типом "No email found", но не присваивает значение.

Аннотированное присваивание всегда создает локальную переменную, даже если вы не присваиваете значение. Из документов:

Если имя отмечено в области действия функции, то это имя является локальным для этой области.

Если вам интересно, пустые аннотированные назначения полезны для таких случаев:

n: int
if spam:
    n = spam**2
else:
    n = -1

Это единственный способ сообщить статическому контролеру типов, как Mypy, чтобы убедиться, что n в конечном итоге держит int не важно какой if ветку ты берешь.

"Я назначаю parsed_json в другом месте моего кода"

Ну, это проблема. Вы должны передать переменную в код или объявить ее глобальной, но лучше всего этого избежать. Вы можете сделать простое изменение, как это.

def printSet(parsed_json):
    for user in range (0,len(parsed_json['members'])-1):
       userDict=parsed_json['members'][user]
    #####do a bunch of stuff or whatever

printSet(parsed_json)

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

Что-то еще, что упростит ваш код и поможет отладке, - избавиться от всех try-excepts

keylist=["id", "real_name", ..... "last_name"] #not required, but helpful if you want to print "not found" type messages
for k in keylist:
    if k in userDict.keys():
        print('{}: {}'.format(k, userDict[k]))
    else:
        print('No {} found'.format(k))
Другие вопросы по тегам