2012-10-11 84 views
2

我有一個python module_A這是做這樣的事情:Python的鉤子模塊初始化

myvar = "Hello" 

def message(): 
    print myvar 

從另一個模塊,我要導入的功能message

from module_A import message 

但這定義myvar,我不想要(因爲這裏沒有真正相關的原因)。我想我需要的是區分導入東西從一個模塊和使用任何導入的符號。當我使用message時,我實際上只想要myvar初始化

我有任何類型的python鉤子,我可以用來初始化的東西,每當一個函數或類被訪問?我想類似以下的東西:像這樣的

module_setup_done = False 
def setup(): 
    global module_setup_done, myvar 
    if not module_setup_done: 
     myvar = "Hello" 
     module_setup_done = True 

def message(): 
    setup() 
    print myvar 

但是,以減少混亂,我想這是自動調用的東西:

def _init_module(): 
    global myvar 
    myvar = "Hello" 

def message(): 
    print myvar 

_init_module()將被稱爲唯一一次,並且只有第一次在模塊中的東西是訪問,而不是什麼時候是導入

在python中是否支持這種模式?

回答

4

不,沒有內置的支持。如果你想單獨初始化導入模塊的東西,寫一個函數來完成初始化,然後當你想初始化這些東西時調用函數。如果你想在其他事情被調用時「自動」初始化事物,你必須用你已經發布的代碼自己處理代碼。

但是,如果你發現自己這樣做,你可能會做一些不合理的事情。你不會詳細說明你爲什麼要這樣做,但總的來說,這種隱式初始化在Python中並不是一個好習慣。當你明確地告訴它們是,例如通過導入一個模塊或者調用某種初始化函數時,事物被初始化。爲什麼你覺得有必要進行這種單獨的,隱式的初始化步驟?

+0

我會盡量總結一下:我的全局變量實際上是一個芹菜模塊中的緩存線程,在這個模塊中定義了一些芹菜任務。我有一個這個芹菜模塊的客戶端,它必須導入芹菜任務,但並不真正執行任務(它只會通過芹菜進行代理)。關鍵是,當我在對客戶端進行單元測試時,因爲它正在從celery模塊導入符號,所以緩存線程將被初始化並啓動,即使客戶端中完全不需要這些符號。由於這個超線程,單元測試並沒有結束。 – dangonfast

+0

在這種情況下,更簡單的解決方案可能是根據是否運行測試,使用myvar的if/else。大概有一些方法可以區分正常執行和單元測試執行,然後你可以這樣做: myvar = caching_thread if in_test_mode else否 –

+0

是的,我會做類似於Jeremy Lewis的建議。你真正想要做的是以某種方式標記測試用法,並在這種情況下以不同的方式做事。一種方法就是像我描述的那樣有一個初始化函數,而不是在測試期間調用它。那麼你不得不手動調用它來進行非測試使用,但這並沒有那麼糟糕。 – BrenBarn