我正在编写需要打开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)
我还阅读了与使用单身人士相关的内容,但我并不完全了解它是如何工作的,或者它是否是一个很好的解决方案。
最终,我想知道什么是一个很好的解决方案。请告诉我我可能面临的实施问题,并随意提出更好的解决方案。
感谢您的关注和帮助。
答案 0 :(得分:0)
我会将配置作为一个模块,可以import
整个或部分在需要它的任何其他脚本中。模块本质上是单例,并且在首次加载时会在sys.modules
中缓存,如果后续尝试重新import
,则会使用该条目 - 因此它不会产生实际存在的开销每次发生时都要阅读和执行。
在配置模块的主体中,您可以打开并加载json文件中的信息。可以通过多种方式提供此信息。一个是简单的字典(可能只是json.load()
返回。另一个是解析并转换它并创建对应其各个部分的模块属性。
当然,您也可以向模块添加您想要的任何功能。例如,您可能需要一个必须在其包含的值可用之前调用的特殊函数 - 而不是在首次导入时自动执行它。
换句话说,它是一种非常灵活的方法来处理问题并允许大量自定义,因为它是可扩展的。