我對Python有點新(但完全沒有編程,已經流利地在Perl,PHP,& Ruby中)。 我遇到了所有以前的語言和Python之間的主要區別:主要是我可以輕鬆地將數據從另一個文件讀入整個項目。 這裏有兩個主要的例子,我想解決:整個Python應用程序的一個配置文件
1)我想有一個設置/配置文件(在YAML中),讀取並在config.py文件中解析。然後我想要一個生成的dict()可以被我的其他文件在項目中訪問。我已經想出瞭如何通過from lib.project.config import cfg
這樣做,但這意味着對於導入配置的每個頁面,系統必須重新分析yaml。這對我來說似乎很愚蠢。有沒有辦法讓這個文件解析一次,然後讓結果可以訪問我的項目中的任何其他文件?
2)我想導入一個database.py文件,然後查看我的配置,看看我們是否需要導入sqlite3,mysql或postgresql版本的數據庫類。再次,我可以通過將邏輯直接放入每個需要數據庫類的頁面來管理。但我討厭粘貼代碼,如
if cfg.get('db_type') == 'sqlite':
from lib.project.databases.sqlite3 import database
elif cfg.get('db_type') == 'mysql':
from lib.project.databases.mysql import database
位於需要數據庫類的每個文件的頂部。我寧願增加:
任何幫助將非常感激。 我已經做了大量的搜索和SO搜索,沒有找到我的答案。希望你們中的一個能夠幫助你。
謝謝。
更新: 我這樣做的原因(對於#2)是因爲我也試圖讓其他類繼承數據庫類。 所以lib/project/databases/sqlite.py是數據庫類的定義。 所以是lib/project/databases/mysql.py。 的想法是,這個導入完成後我可以導入類,如用戶類,並定義它像這樣:
class user(database):
...
並由此繼承了所有的結構和數據庫類的方法。 你的建議是簡單地創建一個基於sqlite/mysql邏輯/決策的實例,然後將它傳遞到需要的地方,這是一個很好的解決方案。但我需要更多... 想法?
模塊在每次導入時都不會執行。第一次導入的結果保存在一個'sys.modules'字典中。在隨後導入同一模塊時,緩存的值將被簡單地返回而不是再次運行。這意味着,如果您讀取模塊主代碼中的配置文件並將結果保存在全局模塊變量中,則只會發生一次。給定模塊的所有導入器都可以簡單地引用變量及其結果(或模塊函數)。 – martineau 2015-01-04 11:55:01
Thanks @maartineau,要清楚:這是否意味着我仍然需要導入每個需要它的文件的配置文件(瞭解到它實際上並未每次都進行REparsed)?如果我必須在每個文件上導入,這似乎不是什麼大問題,只是看起來過分。在完成頂層文件的導入之後,我們很想在每個頁面上執行諸如config.settings ['path']之類的操作。 – loqqi 2015-01-04 12:13:08
如果你導入了'config',那麼你應該可以引用'config.settings ['path']'假設在運行模塊的頂層時定義了一個settings字典(這很容易去做)。你可以讓事情看起來像內置的 - 所以'import'甚至不需要 - 但是這樣做是不鼓勵的。 – martineau 2015-01-04 12:31:56