处理配置文件的设计

时间:2017-09-23 16:18:49

标签: python json configuration

我正在编写需要打开JSON文件的代码,该文件包含与软件使用相关的一般配置,将其解析为dict并可能覆盖其某些值。在运行期间需要多次访问这些配置以检查设置。

例如:其中一个配置是'username'和'password',如果用户不存在则需要填写,或者只是另外阅读。另一个配置与“软件应该如何工作”有关,具有“模式A”,“模式B”和“模式C”的可能值。

问题是:我不是程序员,我无法找到一个好的设计来管理配置。我应该打开JSON文件,每次我需要时重写并保存它,或者将它解析为变量并将此变量保存在内存中,直到我不再需要它为止(在代码完成运行之前),然后将其保存到最后的JSON文件?

另一个问题是:如果我更愿意将其解析为变量并保留它直到程序结束,我应该怎么做?这个变量需要被几个函数访问,所以我认为我应该使用一个全局变量,但我读过使用“全局”语句写入全局变量是一种不好的做法,可能会导致混乱。例如:

import json
config_global = None

def read_JSON_file():
    config_file = open(r'config_file.json')
    global config_global
    config_global = json.load(config_file)
    config_file.close()

def functionA():
    global config_global
    # Do something with config_global

def functionB():
    global config_global
    # Do something with config_global

def save_JSON_file()
    config_file = open(r'config_file.json', 'w')
    json.dump(config_global, config_file)
    config_file.close()

read_JSON_file()
functionA()
functionB()
save_JSON_file()

我还认为我可以在函数调用之间传递配置变量引用,但我不知道它是否是一个很好的解决方案,因为我必须为每个函数传递它,EVERYTIME:

import json

def read_JSON_file() -> dict:
    config_file = open(r'config_file.json')
    config = json.load(config_file)
    config_file.close()
    return config

def functionA(config: dict):
    # Do something with config

def functionB(config: dict):
    # Do something with config

def save_JSON_file(config: dict)
    config_file = open(r'config_file.json', 'w')
    json.dump(config, config_file)
    config_file.close()

parsed_config = read_JSON_file()
functionA(parsed_config)
functionB(parsed_config)
save_JSON_file(parsed_config)

我还阅读了与使用单身人士相关的内容,但我并不完全了解它是如何工作的,或者它是否是一个很好的解决方案。

最终,我想知道什么是一个很好的解决方案。请告诉我我可能面临的实施问题,并随意提出更好的解决方案。

感谢您的关注和帮助。

1 个答案:

答案 0 :(得分:0)

我会将配置作为一个模块,可以import整个或部分在需要它的任何其他脚本中。模块本质上是单例,并且在首次加载时会在sys.modules中缓存,如果后续尝试重新import,则会使用该条目 - 因此它不会产生实际存在的开销每次发生时都要阅读和执行。

在配置模块的主体中​​,您可以打开并加载json文件中的信息。可以通过多种方式提供此信息。一个是简单的字典(可能只是json.load()返回。另一个是解析并转换它并创建对应其各个部分的模块属性。

当然,您也可以向模块添加您想要的任何功能。例如,您可能需要一个必须在其包含的值可用之前调用的特殊函数 - 而不是在首次导入时自动执行它。

换句话说,它是一种非常灵活的方法来处理问题并允许大量自定义,因为它是可扩展的。