如何自动保存常量?
How to automate saving constants?
我正在进行 运行 实验,理想情况下,一旦我的所有代码都正常工作,唯一需要更改的参数将全部存在于一个文件中。我最初的想法是将这些参数存储在 JSON 文件中:
{
"param1": 1,
"param2": "string parameter"
}
显然,我有两个以上的参数。事实证明这是一个 噩梦 ,因为我的 IDE 不会猜测任何参数,这大大减慢了我的编程速度,因为我通常觉得有义务为每个参数创建局部变量我正在使用的当前函数中需要的常量。这会导致很多不必要的代码(但对于该函数而言,它比尝试索引 JSON 对象要方便得多)。
我的下一个想法是:将常量存储在文件中,例如:
PARAM1 = 1
PARAM2 = 'string parameter'
这个问题是我想存储参数和实验结果,这样我就可以回头看看指定了哪些参数来产生这些结果。
除此之外,我的想法是使用 dataclass
(可能是 frozen=True
),因为它们可以转换为字典。但是,我不需要访问 class 的实例,只需要其中的常量。
另一个想法是使用带有静态变量的class:
class ExperimentalMetaData:
param1 = 1
param2 = "string parameter"
可以用 vars(ExperimentalMetaData)
转换为 dict
,除了这将包含额外的键,在我开始存储数据之前应该弹出这些键。
我的问题是:在 python 中存储常量的最佳方式是什么,这样它们可以很容易地保存到 JSON 文件中,并且也可以在我的代码中轻松访问?
分解你的问题。
存储数据
将其序列化为 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 我需要很多并且不想包装在某些字典或类似的东西中。否则我只会在模块中使用字典。使用键和 None
预填充字典并进行类型提示,它将完成与自动完成工作相同的工作。
如果您希望能够调用不同版本的输入,给它们一个版本
这允许您创建类似于 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)
我正在进行 运行 实验,理想情况下,一旦我的所有代码都正常工作,唯一需要更改的参数将全部存在于一个文件中。我最初的想法是将这些参数存储在 JSON 文件中:
{
"param1": 1,
"param2": "string parameter"
}
显然,我有两个以上的参数。事实证明这是一个 噩梦 ,因为我的 IDE 不会猜测任何参数,这大大减慢了我的编程速度,因为我通常觉得有义务为每个参数创建局部变量我正在使用的当前函数中需要的常量。这会导致很多不必要的代码(但对于该函数而言,它比尝试索引 JSON 对象要方便得多)。
我的下一个想法是:将常量存储在文件中,例如:
PARAM1 = 1
PARAM2 = 'string parameter'
这个问题是我想存储参数和实验结果,这样我就可以回头看看指定了哪些参数来产生这些结果。
除此之外,我的想法是使用 dataclass
(可能是 frozen=True
),因为它们可以转换为字典。但是,我不需要访问 class 的实例,只需要其中的常量。
另一个想法是使用带有静态变量的class:
class ExperimentalMetaData:
param1 = 1
param2 = "string parameter"
可以用 vars(ExperimentalMetaData)
转换为 dict
,除了这将包含额外的键,在我开始存储数据之前应该弹出这些键。
我的问题是:在 python 中存储常量的最佳方式是什么,这样它们可以很容易地保存到 JSON 文件中,并且也可以在我的代码中轻松访问?
分解你的问题。
存储数据
将其序列化为 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 我需要很多并且不想包装在某些字典或类似的东西中。否则我只会在模块中使用字典。使用键和 None
预填充字典并进行类型提示,它将完成与自动完成工作相同的工作。
如果您希望能够调用不同版本的输入,给它们一个版本
这允许您创建类似于 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)