Python函数在模块命名空间中替换自身

时间:2014-02-24 17:35:56

标签: python

我正在阅读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语句的另一个定义有什么区别?

1 个答案:

答案 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)