1

我正在努力理解以下修饰的 python 函数中 request 和 request.db 的范围(此函数是 Pyramid “一个文件中的待办事项列表应用程序”教程的一部分):

@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 和 request.db 的起源和范围吗?

4

1 回答 1

4

request实际上只是event.request. 该函数可以重写如下:

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

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

于 2013-10-21T13:50:50.990 回答