2013-10-02 69 views
0

感謝您看到這一點,我一直在考慮這幾個小時無濟於事。本質上,我想讓我的代碼更加模塊化和可共享:您可以看到以下文件最初是如何組成更大的文件的。它不工作,我懷疑這是因爲我想要做的事情在Python說我不應該:最好的/你在Python中的實踐共享全局變量,共享函數和類

app_config.py

app_name = "quick scraper" 
mysql_db = ... # intended "global" variable that connects to database 

main.py

from app_config import *     # Getting shared variables 
import app_library      # See code app_library.py below 
... 
logger = logging.getLogger(app_name)  # logger object to be shared later 
... 
app_library.dlAndSaveWebpage(url)   # Module has key helper functions 
... 

app_library.py

import app_models_orm as app_models 

def dlAndSaveWebpage(url) 
    # download and process url 
    ... 
    app_models.Webpage.create(url=url, body=body) 

app_models_orm.py

class MySQLModel(Model): 
    class Meta: 
    database = mysql_db 

class Webpage(MySQLModel): 
    id = ... 
    ... 
  1. 類,因爲可變mysql_db不會在文件中存在的app_models_orm.pyMySQLModel失敗。我可以做一個import app_config,但我希望app_models_orm.py被同一目錄中的多個腳本使用。如果我必須爲腳本導入一個自定義文件,那麼我必須複製這個模型文件,這看起來很奇怪和錯誤。

  2. 同樣,我想用app_library.py通過在同一目錄中的多個腳本。從main.py調用app_library似乎有意義,但如果app_library需要直接從app_config.py引用變量,那麼我也必須複製app_library.py

  3. main.py包含一個logger對象,當所有這些代碼放在一個文件中時,所有的各種方法都可以訪問/使用。功能如何(或應該?)app_library.py訪問記錄器類的這個實例?

再次感謝您的幫助。在這種情況下,請隨時「教我如何捕魚」:我看到很多關於使用全局導入文件的文章,但這並不意味着在未添加自定義導入的情況下共享後兩個文件的意圖,也不是幫助模型文件,導入時,由於該類正在尋找一個不在文件中的變量,因此會導致錯誤。可能有正確的方法來做這一切,我想你們中的許多人會知道如何。

+0

您是否閱讀過http://docs.python.org/2/tutorial/modules.html?還有http://docs.python.org/dev/reference/import.html?後者大約是3.x,但它也應該適用於2.7。 –

回答

2

爲了使代碼更加模塊化,第一步總是將所有全局變量移動到「config」對象中。在一個簡單的版本中,它爲您提供了一個全局變量,其中包含您的所有代碼。 app_name = "quick scraper"變爲:

class Config(object): 
    def __init__(self): 
     self.app_name = "quick scraper" 

config = Config() 

然後,您可以使用此像這樣:

logger = logging.getLogger(config.app_name) 

在接下來的步驟中,您更改代碼使用哪個獲取作爲一個__init__參數設置爲當前配置的參考類。這可以讓你有幾個CONFIGS,擺脫所有的全局變量:

class Main(object): 
    def __init__(self, config): 
     self.config = config 

     self.logger = logging.getLogger(self.config.app_name) 

     ... 

     self.app_library = AppHelper(self.config) 
     self.app_library.dlAndSaveWebpage(url) 

這意味着你需要把所有(或大部分)的功能爲輔助類的方法。

+0

你沒有實例化'Config'。正如給出的那樣,你的代碼會產生一個'AttributeError'。 – Alp

+0

@Alp:謝謝,修正了錯字。 –