我是python的新手,并尝试阅读bottle.py源代码
在文件中,我们必须
from bottle import route, run
使用瓶子。
我尝试通过
读取路径只是第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 wrapper
route = make_default_app_wrapper('route')
在make_default_app_wrapper中,app被调用,但app在第3325行定义
app = default_app = AppStack()
所以当调用函数make_default_app_wrapper时,应该没有名为app的对象(我猜?),那么返回的func如何知道应用程序指向的是什么?我有什么不对吗?
答案 0 :(得分:4)
调用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)
Python在全局命名空间中查找app
的值。请注意,app
的值甚至可以从wrapper
的一次调用更改为下一次。 Python不会知道这一点。 app
的值不是硬编码的。每次调用wrapper
时都会查找它。