初始化时解析文件并使所有人都可以访问 类

Parse file upon initialization and make accessible to all classes

本质上,当金字塔应用程序启动时,我需要解析一个文件并使该文件中的数据可供整个应用程序使用。最重要的是,我需要监视文件的变化,它本质上是一个配置文件。我正在考虑只制作一个单例并在初始化 Configurator 时在应用程序启动时初始化它。这是最好的方法吗,还是我应该使用其他方法 follow/consider?

抱歉,刚接触金字塔 python,谢谢!

正如许多地方所指出的那样,Singleton is considered a code smell 应避免使用。恕我直言,如果有合理的权衡,可以使用 Singleton 。例如,如果使用 Singleton 可以显着提高性能。在您的情况下,情况可能就是这样:如果配置文件在您应用程序的许多地方使用,多次读取该文件可能会影响您的性能。但是,如果您选择使用 Singleton,请记住随之而来的危险。

为了回答您的问题,我不认为可以告诉您最好的方式是什么,因为这取决于您的特定应用程序。只能建议大家综合考虑每个选项的优缺点,根据自己的需要做出选择。

我们使用顶层 app/config.py 做这件事(使用 Pyramid 和全局应用程序设置),它只是一个配置变量列表(可能还有它们的默认值)。然后在我们的主要功能中,我们加载配置并设置 config 模块的各种属性,以便应用程序可以使用它们。

例如,这里是 app/config.py:

image_dir = '/mnt/images'
s3_access_key = None  # these must be specified in the config INI
s3_secret_key = None

这是我们配置 INI 的相关部分(例如:app/development.ini):

[app:main]
app.image_dir = ./test_images
app.s3_access_key = ABCD1234...
app.s3_secret_key = EFGH5678...

以及我们app/main.py中的相关配置加载代码:

from . import config

def main(global_config, **settings):
    config.image_dir = settings.get('app.image_dir', config.image_dir)
    config.s3_access_key = settings['app.s3_access_key']
    config.s3_secret_key = settings['app.s3_secret_key']

    configurator = Configurator(settings=settings)
    # ... configure and add routes
    configurator.scan()

    return configurator.make_wsgi_app()

然后其他应用程序代码可以简单地from app import configfrom . import config并使用设置,例如:os.path.join(config.image_dir, 'my_image.jpg')