Python中共享全局变量、共享函数和类的最佳实践

2024-09-27 07:35:46 发布

您现在位置:Python中文网/ 问答频道 /正文

谢谢你看这个,我想了好几个小时都没用。本质上,我想让我的代码更模块化和可共享:您可以看到以下文件最初是如何组成一个更大的文件的。它不起作用,我怀疑是因为我试图用Python做我不该做的事情:

app_config.py

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

main.py

^{pr2}$

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.py的类MySQLModel失败。我可以做一个import app_config,但是我想让同一目录中的多个脚本使用app_models_orm.py。如果我必须将一个自定义文件导入到脚本中,那么我必须复制models文件,这看起来很奇怪,而且是错误的。

  2. 类似地,我想通过同一目录中的多个脚本使用app_library.py。从main.py调用app_library似乎是有意义的,但是如果app_library需要直接从app_config.py引用变量,我还必须复制app_library.py

  3. main.py包含一个logger对象,当所有这些代码放在一个文件中时,所有不同的方法都可以访问/使用。如何能够(或应该?)app_library.py函数访问logger类的这个实例吗?

再次感谢你的帮助。在这个例子中,请随意“教我如何捕鱼”:我看到了很多关于使用全局导入文件的帖子,但这无助于在不添加自定义导入的情况下共享后两个文件的意图,也无助于模型文件的导入,遇到错误,因为类正在查找文件中不存在的变量。可能有一个正确的方法来做这些,我想你们中的很多人都知道怎么做。在


Tags: 文件代码py脚本configappurldb
1条回答
网友
1楼 · 发布于 2024-09-27 07:35:46

为了使代码更模块化,第一步总是将所有全局变量移到“config”对象中。在一个简单的版本中,它给了你一个全局变量,所有的代码都共享这个变量。app_name = "quick scraper"变成:

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

config = Config()

然后可以这样使用:

^{pr2}$

在下一步中,您将代码更改为使用获取对当前配置的引用的类作为__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)

这意味着您需要将所有(或大部分)函数转换为helper类的方法。在

相关问题 更多 >

    热门问题