2011-02-11 68 views
2

我一直在尋找通過的來源爲pyFacebook庫,發現下面的代碼:請問這個奇怪的蟒蛇裝飾工作

def require_login(next=None, internal=None, required_permissions=None): 
    def decorator(view): 
     def newview(request, *args, **kwargs): 
      next = newview.next 
      internal = newview.internal 

      try: 
       fb = request.facebook 
      except: 
       raise ImproperlyConfigured('Make sure you have the Facebook middleware installed.') 

      if internal is None: 
       internal = request.facebook.internal 

...   

      return view(request, *args, **kwargs) 
     newview.next = next 
     newview.internal = internal 
     return newview 
    return decorator 

我試圖跳過irrelelvant代碼,因此在中間的省略號。完整列表可以在https://github.com/sciyoshi/pyfacebook/blob/master/facebook/djangofb/__init__.py

我的困惑源於第四行的引用到嵌套函數的'next'屬性。我無法弄清newview.next應該是什麼值,只要我自己嘗試類似的實驗,我就會得到'函數沒有內部屬性'的錯誤。然而,代碼工作,因爲我在django項目中使用它沒有問題。如果有人能向我解釋這裏發生了什麼,會非常高興。

+0

我已經編輯我的答案定義 - 現在它顯示你到底你在日pyFacebook在演示代碼中看到了同樣的情況。 – PoltoS 2011-02-11 02:47:22

+0

注意:不要做這段代碼的程序員,重命名`next`。 `next`是一個內建函數。 – SingleNegationElimination 2011-02-11 03:56:01

回答

1

在Python中,函數內部定義的變量與外部定義的函數的屬性不同。

下面的例子可能會有所幫助:

cass A: 
    a = 1 
    def `__init__`(self): 
    self.a = 2 

print A().a 
print A.a 

UPD:

newview.next = next 

: 對象NewView的是在函數內部的範圍只是功能後,由於定義請記住,在Python中,函數也是對象,也可以有屬性!

這裏是一個更有益例如:

def b(): 
    x=b.x 
    print x 

b() 
> Traceback (most recent call last): 
> File "<stdin>", line 1, in <module> 
> File "<stdin>", line 2, in b 
> AttributeError: 'function' object has no attribute 'x' 
b.x = 1 
b() 
> 1 

這裏沒有魔法:B()不知道它的名字。它只是看到一個變量b在它指向自身的範圍內。這可能是一些變量d通過

d = b 
d.x = 1