-1

在我尝试将其放入函数之前,我的代码运行良好。定义函数、缩进代码并调用函数后,我会收到错误消息:

“在赋值之前引用了局部变量‘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()
4

2 回答 2

1

我从不分配变量“打印”。

是的你是:

print:("No email found")

这是一个带注释的赋值语句,它print使用 type进行注释"No email found",但不赋值。

一个带注释的赋值总是创建一个局部变量,即使你没有赋值。从文档:

如果在函数范围内注释了名称,则该名称对于该范围是本地的。

如果您想知道,空注释分配对于以下情况很有用:

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

这是您可以告诉像 Mypy 这样的静态类型检查器来验证无论您采用哪个分支n最终都会持有的唯一方法。intif

于 2018-07-31T19:24:02.200 回答
-1

“我在代码的其他地方分配了 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))
于 2018-07-31T16:53:56.723 回答