2013-10-21 24 views
1

我很努力地理解请求和request.db在以下装饰的python函数(该函数是金字塔“Todo列表应用程序在一个文件中”教程)的一部分的范围:金字塔函数内的对象的范围

@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随后在其他函数中被访问。有人能解释魔术物体的请求和request.db的起源和范围吗?

回答

4

request实际上只是event.request的本地别名。该函数可以被重写如下:

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

所以我们所做的修改在通过event对象的属性因为Python通过实际的对象,这些修改将任何调用的函数可以看出。