为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

子衿沉夜 2021-03-19 14:15:26
我是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 wrapperroute = make_default_app_wrapper('route')在make_default_app_wrapper中,调用了app,但是在3325行中定义了appapp = default_app = AppStack()因此,当调用函数make_default_app_wrapper时,应该没有名为app(我猜?)的对象,因此返回的func如何知道应用程序指向的对象?我有什么问题吗?
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

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调用时都会进行查找。


查看完整回答
反对 回复 2021-03-23
  • 1 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信