我使用科学代码,并且将用于计算的参数存储在两个参数类中。我希望有一种简单的方法来保留不同的值,因此我设置了一个模块,该模块仅包含预定义对象的集合。这些都存储在字典中。键名作为字符串在不同的地方使用,这就是为什么我没有为每个选择元组变量的原因。
但是我存储数据的方式在我看来有点不合常规:
from PlaceholderName import field, meshfield
paramlist = {}
########################################################################################
name = "Parameter1"
fieldparams = field.FieldParameters(
compname = "pu_e_r_nrif"
,n1 = 1.0
,lambda0 = 0.800
# etc., about 15 parameters
)
meshparams = meshfield.MeshParameters(
rmax = 6 #um
,zmin = -10 #um
# etc., about 5 parameters
)
paramlist[name] = (fieldparams, meshparams)
########################################################################################
name = "Parameter2"
fieldparams = field.FieldParameters(
# (...)
)
meshparams = meshfield.MeshParameters(
# (...)
)
paramlist[name] = (fieldparams, meshparams)
########################################################################################
name = "Parameter3"
# and so on, 10s of entries like this...
重点是生成的代码易于编辑和监视;就像数据文本文件一样。它也非常易于使用,因为只需导入paramlist
字典,然后以paramlist['name']
的形式访问参数即可。
仍然,这是我从未见过的方法,似乎有些不合常规。有没有达到我目标的更标准方法?
请注意,这不是产品,而是科学代码,并且代码的用户应在源代码中进行更改。
出于可读性和遵循rule of least power的目的,我建议以简单的文本格式而不是代码存储数据。
尽管这确实需要一些解析代码,但不必过于复杂。例如:
[
{
"name": "Parameter1",
"field": {
"compname": "pu_e_r_nrif",
"n1": 1.0,
"lambda0": 0.8,
...
},
"mesh": {
"rmax": 6,
"zmin": -10,
...
}
},
...
]
可以很容易地解析和转换如下(使用dictionary comprehension:]
import json
from PlaceholderName import field, meshfield
with open("path/to/file") as config_file:
paramlist = {
param['name']: (
field.FieldParameters(**param['field']),
meshfield.MeshParameters(**param['mesh'])
)
for param in json.load(config_file)
}
注意:
从您程序的其余部分来看,该配置是一个简单的导入,与以前完全一样。
[您可以使用许多其他文本格式来表示数据,例如YAML(尽管这需要第三方库):
--- - name: Parameter1 field: compname: pu_e_r_nrif n1: 1.0 lambda0: 0.8 ... mesh: rmax: 6 zmin: -10 ... - ...
*或什至根据模式检查,例如JSON Schema:
{
"$schema": "https://json-schema.org/draft/2019-09/schema",
"$id": "http://example.com/config.schema.json",
"title": "JSON schema for config.json",
"type": "array",
"contains": {
"type": "object",
"required": [
"name",
"field",
"mesh"
],
"properties": {
"name": {
"description": "The name of the parameter, must be unique",
"type": "string"
},
"field": {
"type": "object",
"required": [
"compname",
"n1",
"lambda0"
],
"properties": {
"compname": {
"type": "string"
},
"n1": {
"type": "number"
},
"lambda0": {
"type": "number"
}
}
},
"mesh": {
"type": "object",
"required": [
"rmax",
"zmin"
],
"properties": {
"rmax": {
"type": "number"
},
"zmin": {
"type": "number"
}
}
}
}
}
}