2012-09-19 38 views
8

在我的應用程序中,我使用example包中的模塊examplemod如何覆蓋導入的Python模塊中的常量?

我的應用程序:

from example import examplemod 
examplemod.do_stuff() 

它導入另一個模塊中example像這樣。

examplemod.py:

from example import config 
# uses config 
# then does stuff 

config採用恆定。

config.py:

CONSTANT = "Unfortunate value" 

我想,當我在我的應用程序中使用examplemod(將其設置爲CONSTANT = "Better value")來覆蓋這個常數,我寧願不修改基礎模塊,所以我不必維護我自己的軟件包。我怎樣才能做到這一點?

+0

我可能是錯的,但我認爲你可以給變量賦值一旦它被導入。 – Borgleader

回答

3

謝謝大家對你的答案。他們指出我的方向是正確的,儘管他們都沒有寫作。最後我做了以下內容:

import example.config 
example.config.CONSTANT = "Better value" 

from example import examplemod 
examplemod.do_stuff() 
# desired result! 

(另外,我提交了一個補丁模塊維護者,使常數的配置選項,所以我沒有這樣做,但需要安裝槍托模塊同時)。

1

我不知道這是否足夠,但你嘗試:

from example import config 
config.CONSTANT = "A desirable value" 

確保examplemod導入之前做到這一點。這應該工作,因爲python緩存進口,所以您修改的config將與examplemod獲得的相同。

1

這就是所謂的monkey patching,這是相當普遍的,雖然如果有另一種方式來完成同樣的事情不理想:

examplemod.config.CONSTANT = "Better value" 

的問題是,你是依靠examplemod的內部和config剩餘相同,所以這可能會中斷,如果任何模塊更改。

12

是的,但與完全合格的訪問路徑有望模塊它只會工作:

import example 
example.examplemod.config.CONSTANT = "Better value" 
example.examplemod.do_stuff() 
+0

另外值得一提的是,如果exam​​plemod模塊使用'from config import CONSTANT'語法直接將CONSTANT導入其符號表中,則需要執行'example.examplemod.CONSTANT =「Better value」',因爲examplemod會有它自己參考了CONSTANT。您正在使用的表單替換config.CONSTANT,它適用於examplemod模塊正在使用'from examplemod import config; config.CONSTANT'。 – Symmetric