gpt4 book ai didi

python - 为什么一个方法可以引用一个 undefined variable ?

转载 作者:太空宇宙 更新时间:2023-11-04 10:47:08 25 4
gpt4 key购买 nike

我是python新手,正在尝试阅读bottle.py源代码

在文档中,我们要

from bottle import route, run

使用 Bottle 。

我尝试阅读源代码,其中路由只是第 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 指向什么?我有什么不对吗?

最佳答案

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

关于python - 为什么一个方法可以引用一个 undefined variable ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com