我正在查看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
我试图跳过不相关的代码,因此跳过了中间的省略号。完整列表可在https://github.com/sciyoshi/pyfacebook/blob/master/facebook/djangofb/__init__.py中找到
我的困惑源于第四行的引用到嵌套函数的'next'属性。每当我自己尝试类似的实验时,我都无法弄清楚
newview.next
的值应该是什么,而我收到“函数内部没有属性内部”错误。但是,代码正常工作,就像我在django项目中使用它一样。如果有人可以向我解释一下这里发生的事情,那将非常高兴。 最佳答案
在Python中,在函数内部定义的变量与在函数内部定义的变量不同。
以下示例可能会有所帮助:
cass A:
a = 1
def `__init__`(self):
self.a = 2
print A().a
print A.a
UPD:
newview对象在函数内部的作用域是由于函数之后的定义:
newview.next = next
请记住,在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 = b
d.x = 1