我有一個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中是否支持這種模式?
我會盡量總結一下:我的全局變量實際上是一個芹菜模塊中的緩存線程,在這個模塊中定義了一些芹菜任務。我有一個這個芹菜模塊的客戶端,它必須導入芹菜任務,但並不真正執行任務(它只會通過芹菜進行代理)。關鍵是,當我在對客戶端進行單元測試時,因爲它正在從celery模塊導入符號,所以緩存線程將被初始化並啓動,即使客戶端中完全不需要這些符號。由於這個超線程,單元測試並沒有結束。 – dangonfast
在這種情況下,更簡單的解決方案可能是根據是否運行測試,使用myvar的if/else。大概有一些方法可以區分正常執行和單元測試執行,然後你可以這樣做: myvar = caching_thread if in_test_mode else否 –
是的,我會做類似於Jeremy Lewis的建議。你真正想要做的是以某種方式標記測試用法,並在這種情況下以不同的方式做事。一種方法就是像我描述的那樣有一個初始化函數,而不是在測試期間調用它。那麼你不得不手動調用它來進行非測試使用,但這並沒有那麼糟糕。 – BrenBarn