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

2024-04-24 03:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python还不熟悉,而且正在努力阅读瓶子.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\u default\u app\u包装器中,调用app,但app在第3325行中定义

app = default_app = AppStack()

所以当调用make\u default\u app\u wrapper函数时,应该没有名为app的对象(我猜是吧?),那么返回的func如何知道应用程序指向什么呢?我做错什么了吗?你知道吗


Tags: thetonameappdefault瓶子bottlemake
1条回答
网友
1楼 · 发布于 2024-04-24 03:32:40

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时都会查找它。你知道吗

相关问题 更多 >