2013-05-12 55 views
1

我是新來的蟒蛇,並試圖讀取bottle.py源代碼爲什麼一個方法可以引用一個未定義的變量?

在文檔中,我們必須

from bottle import route, run 

使用奶瓶。

我嘗試閱讀源代碼,其中途徑是通過

# 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_wrapper

符合2443只是一個函數defind,應用程序被稱爲,但應用程序是符合規定3325

app = default_app = AppStack() 

所以當函數make_default_app_wrapper被調用時,應該沒有對象叫做app(我猜?),那麼返回的func如何知道應用程序指向什麼?我有什麼問題嗎?

回答

4

make_default_app_wrapper被調用,它定義wrapper,但wrapper本身不叫。只有當wrapper(或route)被調用時,需要定義app

wrapper定義,Python解析線

return getattr(app(), name)(*a, **ka) 

並確定該裸名稱app不是本地變量,因爲它是從未在賦值的左手側或作爲所列一個論點。這隻影響app的查找方式(當調用wrapper時),此時它不會嘗試查找app的值。

wrapper和Python執行語句

return getattr(app(), name)(*a, **ka) 

的Python查找全局命名空間爲app值。請注意,app的值甚至可以從wrapper的一個呼叫更改爲下一個呼叫。 Python不會知道這一點。 app未被硬編碼。每次調用wrapper時查找。

+0

所以關鍵是如果調用'make_default_app_wrapper'時定義'app'。如果定義了'app',那麼它就是一個閉包,如果沒有,'wrapper'每次調用時都會查找'app'。 – Coo 2013-05-12 10:17:22

+0

好吧,不完全 - 即使'app'是在調用'make_default_app_wrapper'時定義的,每次都會查找'app'。 – unutbu 2013-05-12 11:21:15

+0

呃?那麼如果我定義'app',並且想要調用它,而不管其他'app'是否定義在後面? – Coo 2013-05-12 11:33:08

相關問題