我正处于运行实验的过程中,理想的情况是,一旦我的所有代码都正常工作,唯一需要更改的参数都会出现在一个文件中。我最初的想法是将这些参数存储在JSON文件中:
{
"param1": 1,
"param2": "string parameter"
}很明显,我有两个以上的参数。这实际上是一个噩梦,因为我的IDE不会猜测任何参数,这会极大地减缓我的编程速度,因为我通常觉得有义务为我正在工作的当前函数中所需的每个常量创建局部变量。这会导致大量不必要的代码(但是该函数的本地代码比尝试索引JSON对象要方便得多)。
我的下一个想法是:将常量存储在一个文件中,如:
PARAM1 = 1
PARAM2 = 'string parameter'这方面的问题是,我想将参数与实验结果一起存储,这样我就可以回头看哪些参数被指定来生成这些结果。
除此之外,我的想法是使用dataclass (可能与frozen=True一起使用),因为它们可以转换为字典。但是,我不需要访问类的实例,只需要访问类中的常量。
另一个想法是使用带有静态变量的类:
class ExperimentalMetaData:
param1 = 1
param2 = "string parameter"它可以转换为带有dict的vars(ExperimentalMetaData),但这将包含在我开始存储数据之前应该弹出的附加键。
我的问题是:在python中存储常量的最佳方法是如何轻松地将它们保存到JSON文件中,并在代码中轻松地访问这些常量?
发布于 2022-01-18 16:16:26
如果您希望能够回忆不同版本的输入,请给它们一个版本。
这允许您创建类似于JSON的输入文件,并保留一个解析器集合,如果您做了重大更改,解析器可以解析它们。
下面是一个非常简单的例子,它更具有可持续性
class Parser_v1_2(): pass
class Parser_v3_2(): pass
VERSION_PARSER_MAPPING = {
"1.2": Parser_v1_2,
"3.2": Parser_v3_2,
}
def parser_map(input_file):
with open(input_file) as fh:
input_json = json.load(fh)
# get version or optionally provide a default
version = input_json.get("version", "1.0")
# dynamically select parser
return VERSION_PARSER_MAPPING[version](input_json)发布于 2022-01-18 16:09:13
分头解决你的问题。
存储数据
将其序列化为JSON或YAML (甚至csv)。
获取数据
有一个模块来读取您的json,然后设置正确的值。类似于:
# constants.py
from json import load
data = load("dump.json")
const1: str = data["const1"]
const2: str = data["const2"]
const3: int = data["const3"]# some_other_module.py
from constants import const1, const2 # IDE knows what they are我只会用模块中的vars手动完成这一操作,因为我需要少量(<20)个vars,并且不想在某些字典或类似的东西中包装。否则,我只会在模块中使用dict。预先用键和None填充dict,并提示它将完成自动完成工作的同样工作。
https://stackoverflow.com/questions/70758715
复制相似问题