在模块中定义预初始化对象列表的最佳方法是什么?

问题描述 投票:0回答:1

我使用科学代码,并且将用于计算的参数存储在两个参数类中。我希望有一种简单的方法来保留不同的值,因此我设置了一个模块,该模块仅包含预定义对象的集合。这些都存储在字典中。键名作为字符串在不同的地方使用,这就是为什么我没有为每个选择元组变量的原因。

但是我存储数据的方式在我看来有点不合常规:

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']的形式访问参数即可。

仍然,这是我从未见过的方法,似乎有些不合常规。有没有达到我目标的更标准方法?

请注意,这不是产品,而是科学代码,并且代码的用户应在源代码中进行更改。

python
1个回答
0
投票

出于可读性和遵循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)
    }

注意:

  • 现在的配置一个普通的数据文件,而不是像看起来那样混乱的代码,因此可以使用简单的工具轻松地对其进行语法检查*,而无需了解任何特定编程语言的细节;]]
  • it separates code and data,因此,与实际执行的操作相比,数据传递(例如,通过网络)要安全得多;和
  • 由于处于循环中,因此样板代码的重复较少。
  • 从您程序的其余部分来看,该配置是一个简单的导入,与以前完全一样。

[您可以使用许多其他文本格式来表示数据,例如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"
                    }
                }
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.