金字塔函数中对象的范围

时间:2013-10-21 13:41:51

标签: python scope pyramid

我正在努力理解以下修饰的python函数中的request和request.db的范围(这个函数是Pyramid“Todo List Application in One File”教程的一部分):

@subscriber(NewRequest)
def new_request_subscriber(event):
    request = event.request
    settings = request.registry.settings
    request.db = sqlite3.connect(settings['db'])

我认为函数中的赋值在范围上限于该函数,除非声明为全局;所以根据我的错误理解,当函数完成时,request和request.db将超出范围。但在这种情况下,我显然是错误的,因为随后在其他函数中访问request.db。有人可以解释魔法对象的请求和请求的起源和范围吗?请

1 个答案:

答案 0 :(得分:4)

request实际上只是event.request的本地别名。该功能可以改写如下:

def new_request_subscriber(event):
     event.request.db = sqlite3.connect(event.request.registry.settings['db'])

所以我们所做的就是修改传入的event对象的属性。由于Python传递了实际对象,因此任何调用函数都可以看到修改。 / p>