我是python的新手,正在尝试阅读bottle.py源代码在文件中,我们必须from bottle import route, run使用瓶子。我尝试阅读源代码,其中route只是第2443行中定义的函数# Shortcuts for common Bottle methods.# They all refer to the current default application.def make_default_app_wrapper(name): ''' Return a callable that relays calls to the current default app. ''' @functools.wraps(getattr(Bottle, name)) def wrapper(*a, **ka): return getattr(app(), name)(*a, **ka) return wrapperroute = make_default_app_wrapper('route')在make_default_app_wrapper中,调用了app,但是在3325行中定义了appapp = default_app = AppStack()因此,当调用函数make_default_app_wrapper时,应该没有名为app(我猜?)的对象,因此返回的func如何知道应用程序指向的对象?我有什么问题吗?
1 回答
森林海
TA贡献2011条经验 获得超2个赞
在make_default_app_wrapper
被调用时,它定义了 wrapper
,但wrapper
本身并未被调用。只有在调用wrapper
(或route
)时才app
需要定义。
当wrapper
被定义,Python解析行
return getattr(app(), name)(*a, **ka)
并确定裸名app
不是局部变量,因为它从未在赋值的左侧或作为参数列出。这仅影响app
将被查找的方式(当wrapper
被调用时),它此时不尝试查找的值app
。
当wrapper
被调用时,Python执行该语句
return getattr(app(), name)(*a, **ka)
Pythonapp
在全局名称空间中查找的值。请注意,的值app
甚至可以从一个调用更改为下一个调用wrapper
。Python对此一无所知。该值的app
不硬编码。每次wrapper
调用时都会进行查找。
添加回答
举报
0/150
提交
取消