我正在努力理解以下修饰的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。有人可以解释魔法对象的请求和请求的起源和范围吗?请
答案 0 :(得分:4)
request
实际上只是event.request
的本地别名。该功能可以改写如下:
def new_request_subscriber(event):
event.request.db = sqlite3.connect(event.request.registry.settings['db'])
所以我们所做的就是修改传入的event
对象的属性。由于Python传递了实际对象,因此任何调用函数都可以看到修改。 / p>