2014-02-24 26 views
0

我正在閱讀Werkzeug的一些源代碼,並在werkzeug.wrappers模塊中偶然發現了這塊金塊。Python函數替換模塊名稱空間

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

'import'語句也綁定到名稱;在這個函數中,'from werkzeug.test import run_wsgi_app as _run_wsgi_app'會綁定到一個本地名,除了'global'使得導入綁定一個全局名稱。 –

回答

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)