初始化时解析文件并使所有人都可以访问 类
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 config
或from . import config
并使用设置,例如:os.path.join(config.image_dir, 'my_image.jpg')
本质上,当金字塔应用程序启动时,我需要解析一个文件并使该文件中的数据可供整个应用程序使用。最重要的是,我需要监视文件的变化,它本质上是一个配置文件。我正在考虑只制作一个单例并在初始化 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 config
或from . import config
并使用设置,例如:os.path.join(config.image_dir, 'my_image.jpg')