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

我是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 wrapper


route = make_default_app_wrapper('route')

在make_default_app_wrapper中,调用了app,但是在3325行中定义了app


app = default_app = AppStack()

因此,当调用函数make_default_app_wrapper时,应该没有名为app(我猜?)的对象,因此返回的func如何知道应用程序指向的对象?我有什么问题吗?


子衿沉夜
浏览 256回答 1
1回答

森林海

在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调用时都会进行查找。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python