我正在阅读Werkzeug的一些资料,并在werkzeug.wrappers模块中偶然发现了这个金块。
def _run_wsgi_app(*args):
"""This function replaces itself to ensure that the test module is not
imported unless required. DO NOT USE!
"""
global _run_wsgi_app
from werkzeug.test import run_wsgi_app as _run_wsgi_app
return _run_wsgi_app(*args)
做这样的事情有什么好的打印?这个定义与没有global _run_wsgi_app
语句的另一个定义有什么区别?
答案 0 :(得分:2)
如果你没有global
语句,你将创建一个名为_run_wsgi_app
的局部变量,然后将使用它,但全局命名空间中什么都不会改变。使用global _run_wsgi_app
确保您将全局名称重新绑定到新函数。
请记住global
的基本用法:
def foo():
x = 2
def bar():
global x
x = 3
x = 1
print(x) # --> 1
foo()
print(x) # --> 1
bar()
print(x) # --> 3
您的示例是相同的,但不是直接使用name = ...
绑定名称,而是使用from ... import ... as name
。
在没有global
的情况下重新定义自身的另一种方法是使用包含它的模块对象。
def _run_wsgi_app(*args):
from werkzeug.test import run_wsgi_app as new_run_wsgi_app
import sys
sys.modules[__name__]._run_wsgi_app = new_run_wsgi_app
return new_run_wsgi_app(*args)