簡體   English   中英

共享全局變量,共享函數和類的Python最佳/最佳實踐

[英]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 = ...
  ...
  1. MySQLModelapp_models_orm.py因變量無法mysql_db沒有在文件中存在。 我可以執行import app_config ,但是我想讓app_models_orm.py由同一目錄中的多個腳本使用。 如果必須將文件自定義導入腳本,那么我就必須復制models文件,這看起來很奇怪而且是錯誤的。

  2. 同樣,我想在同一目錄中的多個腳本中使用app_library.py main.py調用app_library似乎main.py ,但是如果app_library需要直接從app_config.py引用變量,那么我還必須復制app_library.py

  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM