Python 取消绑定LocalError:局部变量。。。分配前参考

Python 取消绑定LocalError:局部变量。。。分配前参考,python,error-handling,Python,Error Handling,我得到了一个UnboundLocalError,因为我在if语句中使用了一个模板值,而该语句没有执行。处理这种情况的标准方法是什么 class Test(webapp.RequestHandler): def get(self): user = users.get_current_user() if user: greeting = ('Hello, ' + user.nickname()) else:

我得到了一个
UnboundLocalError
,因为我在if语句中使用了一个模板值,而该语句没有执行。处理这种情况的标准方法是什么

class Test(webapp.RequestHandler):
    def get(self):      
        user = users.get_current_user()
        if user:
            greeting = ('Hello, ' + user.nickname())
        else:
            self.redirect(users.create_login_url(self.request.uri))
...

        template_values = {"greeting": greeting,
                       }
错误:

UnboundLocalError: local variable 'greeting' referenced before assignment
只需切换:

class Test(webapp.RequestHandler):
    def err_user_not_found(self):
        self.redirect(users.create_login_url(self.request.uri))
    def get(self):      
        user = users.get_current_user()
        # error path
        if not user:
            self.err_user_not_found()
            return

        # happy path
        greeting = ('Hello, ' + user.nickname())
        ...
        template_values = {"greeting": greeting,}

我想我需要首先解释一下这个问题:在创建模板值时,使用问候语变量。如果没有用户,则不会设置此变量

没有一个标准的方法来处理这种情况。常用的方法有:

1. make sure that the variable is initialized in every code path (in your case: including the else case)
2. initialize the variable to some reasonable default value at the beginning
3. return from the function in the code paths which cannot provide a value for the variable.
像Daniel一样,我怀疑在重定向调用之后,无论如何都不应该生成任何输出,因此更正后的代码可能会被读取

class Test(webapp.RequestHandler):
  def get(self):      
    user = users.get_current_user()
    if user:
        greeting = ('Hello, ' + user.nickname())
    else:
        self.redirect(users.create_login_url(self.request.uri))
        return
...

    template_values = {"greeting": greeting,
                   }

如果。。。还有什么?bit?我不知道webapp,但我希望你想做
return self.redirect…
无论如何。@Daniel Roseman:对不起,我不明白
return self.redirect
做什么。你能解释一下吗?我使用了乔·金顿建议的
greeting=None
,这很有效。谢谢,谢谢你的回答。我现在用的是
greeting=None
;但当我准备部署应用程序时,我可能会使用此版本。
返回的是什么?为什么有必要?@Zeynel it退出例程,否则解释器将继续执行以下所有语句。谢谢。第二个选项似乎是最简单的,所以我选择了
greeting=None
。为什么
return
是必需的?self.redirect只会指示webapp发送重定向-它是一个常规函数,不能真正中止get()的执行(除非它会引发异常)。因此,如果您不想/必须不在重定向后执行任何进一步的操作,那么您确实应该立即从get返回,并避免执行更多的活动(这可能是不正确的或不必要的)。