Python 为什么方法可以引用未定义的变量?
我是python新手,正在尝试阅读瓶子.py源代码 在文件中,我们必须Python 为什么方法可以引用未定义的变量?,python,python-3.x,bottle,Python,Python 3.x,Bottle,我是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 calla
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_包装中,调用app,但在第3325行中定义了app
app = default_app = AppStack()
因此,当调用函数make_default_app_wrapper时,应该没有名为appI guess?的对象,那么返回的func如何知道应用指向什么呢?我有什么错误吗?当调用make\u default\u app\u wrapper时,它定义了wrapper,但不调用wrapper本身。只有在调用包装器或路由时,才需要定义应用程序
定义包装器后,Python将解析该行
return getattr(app(), name)(*a, **ka)
并确定裸名应用程序不是局部变量,因为它从未位于赋值的左侧或列为参数。这只会影响调用包装器时查找应用程序的方式,此时不会尝试查找应用程序的值
当调用包装器时,Python将执行该语句
return getattr(app(), name)(*a, **ka)
Python在全局命名空间中查找app的值。请注意,app的值甚至可以从一个wrapper调用更改为下一个。Python不会知道这一点。app的值不是硬编码的。每次调用包装时都会查找它。当调用make_default_app_wrapper时,它定义了包装,但不调用包装本身。只有在调用包装器或路由时,才需要定义应用程序
定义包装器后,Python将解析该行
return getattr(app(), name)(*a, **ka)
并确定裸名应用程序不是局部变量,因为它从未位于赋值的左侧或列为参数。这只会影响调用包装器时查找应用程序的方式,此时不会尝试查找应用程序的值
当调用包装器时,Python将执行该语句
return getattr(app(), name)(*a, **ka)
Python在全局命名空间中查找app的值。请注意,app的值甚至可以从一个wrapper调用更改为下一个。Python不会知道这一点。app的值不是硬编码的。每次调用包装时都会查找它。所以关键点是,在调用make_default_app_包装时是否定义了app。若定义了app,那个么它就是一个闭包,若并没有定义,那个么wrapper每次调用它都会查找app。好吧,不完全-即使在调用make_default_app_wrapper时定义了app,每次都会查找app。嗯?那个么,若我定义了一个应用程序并想调用它,而不管以后是否定义了其他应用程序呢?也许我误解了你们。如果在调用make_default_app_wrapper时在全局命名空间中定义了app,则每次都会查找app。如果app是在make_default_app_包装中定义的,那么是的,make_default_app_包装是一个闭包,每次app的值都是相同的。哦!我懂了。我误解了结束语。我认为它只需要在前面定义的任何地方使用,并保留引用。因此,关键点是在调用make_default_app_wrapper时是否定义了app。若定义了app,那个么它就是一个闭包,若并没有定义,那个么wrapper每次调用它都会查找app。好吧,不完全-即使在调用make_default_app_wrapper时定义了app,每次都会查找app。嗯?那个么,若我定义了一个应用程序并想调用它,而不管以后是否定义了其他应用程序呢?也许我误解了你们。如果在调用make_default_app_wrapper时在全局命名空间中定义了app,则每次都会查找app。如果app是在make_default_app_包装中定义的,那么是的,make_default_app_包装是一个闭包,每次app的值都是相同的。哦!我懂了。我误解了结束语。我认为它只需要在前面定义的任何地方使用,并保留引用。