如何在裝入主程序的所有其他模塊中使用objectstore
。
這是那些東西,你可以做之一,但幾乎可以肯定不應 ...所以首先我將解釋如何,然後解釋原因。
如果你想要的東西是每一個模塊中直接使用,而無需將其導入每個模塊中,就好像它是一個內置的...答案是將其添加到建宏。那麼,你如何做到這一點?
從技術上講,沒有保證安全的方法,但實際上,我相信在每個主要實現的每個版本中,都會模擬builtins
模塊。所以:
import builtins
builtins.objectstore = objectstore
注意的是Python 2.x中,該模塊被稱爲__builtin__
,但以同樣的方式。
這不會在少數情況下工作,例如,內部代碼是由一個exec
用自定義globals
,提供了一個自定義的__builtins__
運行。如果你需要處理......那麼你不能輕易處理它。但是如果你只關心CPython(我認爲PyPy,而不是Jython,並且我不知道Iron ...)呢?在CPython中,確保每個全球環境,包括爲compile
,exec
等創建的環境都將包含一些名稱爲__builtins__
的內容,該內容既可以是該環境的內建字典,也可以是某個對象的名稱空間是環境的內建字典。如果根本沒有內建函數,或者您正在查看builtins模塊本身的全局環境,它可能會丟失。所以,你可以這樣寫:
try:
__builtins__['objectstore'] = objectstore
except AttributeError:
__builtins__.objectstore = objectstore
(即不處理,你正在運行的builtins
名稱空間本身的內部代碼的情況下,因爲......我不知道你想要做什麼有,說實話。)
當然這很醜陋。這可能是故意的。
現在,你爲什麼不想這樣做?
那麼,首先,它會讓你的代碼難以閱讀。除了搜索一些甚至在當前模塊中沒有引用的完全不相關的模塊之外,任何查看代碼的人都無法確定哪裏定義了objectstore
。
另一方面,它可能導致難以調試的問題。如果稍後更改哪些模塊導入哪些其他模塊的列表,則某些取決於修補程序objectstore
的模塊可能會在修補之前運行,並因此失敗。
此外,事實上沒有記錄您可以monkeypatch builtins,或者這樣做會影響內置環境,這是一個好兆頭,它不是您應該依賴的東西。
最好讓你在做什麼明確。其他objectstore
爲其他模塊從某個模塊導入的全局模塊。然後立即清楚發生了什麼,即使是粗略的一瞥。
例如,爲什麼不將objectstore = get_objectstore()
添加到mainvars
,然後讓每個模塊都做from mainvars import objectstore
?或者,你甚至想把它變成一個單身人士,所以任何人都可以撥打get_objectstore()
並且知道他們都會獲得單一的共享價值。不知道你想要完成什麼,很難提出一個最好的解決方案。我可以肯定地說,讓objectstore
成爲內建式跨模塊全球性幾乎不可能成爲幾乎所有您可能試圖完成的最佳解決方案。
感謝您的及時回覆。讓我詳細說一下。我將字典中的所有圖像和聲音加密並作爲cpickle轉儲到py文件中。 cpickle加載對象字典的函數在另一個py文件中。我在主程序開始時調用一次該函數,並將整個圖像和聲音字典加載到內存中。現在我需要從程序的任何其他部分(包括所有其他加載的文件)訪問此字典。爲什麼這是不好的,哪個是最好的辦法呢? – wookie 2014-09-02 19:21:59
@wookie:這個答案中的哪部分沒有解釋?什麼阻止你讓'objectstore'成爲某個模塊的成員,並讓程序的所有其他部分導入該模塊,這對大多數其他Python應用程序來說是正常的? – abarnert 2014-09-02 19:29:56
我嘗試了你上面寫的內容,發現你在最後一段中說的最好。你首先回答接受。 – wookie 2014-09-02 19:34:24