为什么方法可以引用未定义的变量?

时间:2013-05-12 09:54:29

标签: python python-3.x bottle

我是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如何知道应用程序指向的是什么?我有什么不对吗?

1 个答案:

答案 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时都会查找它。