Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么方法可以引用未定义的变量?_Python_Python 3.x_Bottle - Fatal编程技术网

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

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

我是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_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的值都是相同的。哦!我懂了。我误解了结束语。我认为它只需要在前面定义的任何地方使用,并保留引用。