代码之家  ›  专栏  ›  技术社区  ›  Zeynel

unbundlocalerror:局部变量…在赋值之前引用

  •  4
  • Zeynel  · 技术社区  · 14 年前

    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 回复  |  直到 14 年前
        1
  •  3
  •   fabmilo    14 年前

    只需切换:

    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,}
    
        2
  •  2
  •   Martin v. Löwis    14 年前

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

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