在模块namesp中替换自身的Python函数

2024-03-29 08:21:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在阅读一些Werkzeug的资料,无意中发现了这个金块包装纸模块。你知道吗

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语句的定义有什么区别?你知道吗


Tags: 模块runtestappwsgi定义defargs
1条回答
网友
1楼 · 发布于 2024-03-29 08:21:28

如果不使用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重新定义自身的方法是使用包含它的module对象。你知道吗

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)

相关问题 更多 >