2010-10-29 60 views
4

我得到一個UnboundLocalError,因爲我在未執行的if語句中使用模板值。處理這種情況的標準方法是什麼?UnboundLocalError:本地變量...在分配之前引用

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 
+3

是有一些原因,你不能在'if ... else'位之前執行'greeting = None'(或合理的默認值)? – 2010-10-29 03:27:49

+0

謝謝。我不知道。 – Zeynel 2010-10-29 03:34:39

+1

我不知道webapp,但我希望你想要'return self.redirect ...'反正。 – 2010-10-29 08:07:00

回答

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

感謝您的回答。我現在用了'greeting = None';但是當我準備好部署應用程序時,我可以使用此版本。什麼是「返回」呢?爲什麼有必要? – Zeynel 2010-10-29 15:51:26

+0

@Zeynel退出例程,否則解釋器將繼續執行以下所有語句。 – fabrizioM 2010-10-29 18:19:42

2

我想我需要先說明問題:在創建template_values,您使用的問候語變量。如果沒有用戶,該變量將不會被設置。

有沒有一種標準的方法來處理這種情況。常用的方法有:

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. 

像丹尼爾,我懷疑是轉接呼叫後,你不應該產生任何輸出,無論如何,所以更正後的代碼可能會讀取

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

謝謝。看起來第二種選擇是最簡單的,所以我選擇了「greeting = None」。爲什麼需要「返回」? – Zeynel 2010-10-29 15:53:46

+1

self.redirect只會指示webapp發送重定向 - 它是一個常規函數,不能真正中止get()的執行(除非會引發異常)。因此,如果您不想/必須在重定向之後不再執行任何操作,那麼您應該立即從獲取中返回,並避免執行更多的活動(這會導致不正確或不必要的操作)。 – 2010-10-29 17:08:02

相關問題