繁体   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