UnboundLocalError:在赋值前引用了局部变量...

4 投票
2 回答
24445 浏览
提问于 2025-04-16 06:16

我遇到了一个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

2 个回答

2

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

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

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,
                   }
3

只需切换:

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,}

撰写回答