[英]Best/your practices in Python for sharing global variables, shared functions and classes
感謝您查看此內容,我已經考慮了好幾個小時而徒勞無功。 本質上,我想使代碼更具模塊化和可共享性:您可以看到以下文件最初是如何構成更大的文件的。 它不起作用,我懷疑是因為我試圖用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 = ...
...
類MySQLModel
的app_models_orm.py
因變量無法mysql_db
沒有在文件中存在。 我可以執行import app_config
,但是我想讓app_models_orm.py
由同一目錄中的多個腳本使用。 如果必須將文件自定義導入腳本,那么我就必須復制models文件,這看起來很奇怪而且是錯誤的。
同樣,我想在同一目錄中的多個腳本中使用app_library.py
。 從main.py
調用app_library
似乎main.py
,但是如果app_library
需要直接從app_config.py
引用變量,那么我還必須復制app_library.py
。
main.py
包含一個logger
對象,當將所有這些代碼放到一個文件中時,所有各種方法都可以訪問/使用。 app_library.py
函數如何(或應該?)訪問logger類的此實例?
再一次感謝你的幫助。 在這種情況下,也請隨時“教我如何釣魚”:我看到了很多有關使用全局導入文件的文章,但這無助於在不添加自定義導入的情況下共享后兩個文件的意圖,也沒有幫助。幫助模型文件,該文件在導入時出現錯誤,因為類正在尋找文件中未包含的變量。 解決所有這些問題可能是正確的方法,我想你們中的許多人會知道如何做。
為了使代碼更具模塊化,第一步始終是將所有全局變量移到“ 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__
參數。 這使您可以進行多個配置並擺脫所有全局變量:
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)
這意味着您需要將所有(或大部分)函數轉換為幫助程序類的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.