我正在查看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

10-08 16:13