При вводе кода в функцию появляется "Локальная переменная, на которую ссылаются перед присваиванием"
Мой код работает нормально, пока я не попробую поместить его в функцию. После определения функции, отступа кода и вызова функции я получаю сообщение об ошибке "Локальная переменная 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))