1

我是 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怎么知道app指向什么?我有什么问题吗?

4

1 回答 1

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)

appPython在全局命名空间中查找 for 的值。请注意, 的值app甚至可以从一次调用更改为wrapper下一次调用。Python 不会知道这一点。的不是app硬编码的。每次wrapper调用时都会查找它。

于 2013-05-12T10:00:34.813 回答