【发布时间】:2017-03-22 15:13:57
【问题描述】:
我正在用 Python 3 编写一个程序来处理多种设备。而且我必须为每个设备存储常量。一些常量对所有设备都是通用的并且永久固定,但其他一些常量因版本而异,具体取决于设备的固件版本。我必须为所有版本存储常量,而不仅仅是最后一个。请告诉我为不同设备和多个版本定义常量的 Pythonic 方式。
我目前的解决方案是这样的:
general = {
'GENERAL_CONST_1': 1,
'GENERAL_CONST_2': 2,
...
'GENERAL_CONST_N': N
}
device_1 = dict()
device_1[FIRMWARE_VERSION_1] = {
'DEVICE_1_CONST_1': 1,
'DEVICE_1_CONST_2': 2,
...
'DEVICE_1_CONST_N': N
}
device_1[FIRMWARE_VERSION_1].update(general)
device_1[FIRMWARE_VERSION_2] = {
'DEVICE_1_CONST_1': 1,
'DEVICE_1_CONST_2': 2,
...
'DEVICE_1_CONST_N': N
}
device_1[FIRMWARE_VERSION_2].update(general)
device_2 = dict()
device_2[FIRMWARE_VERSION_1] = {
'DEVICE_2_CONST_1': 1,
'DEVICE_2_CONST_2': 2,
...
'DEVICE_2_CONST_N': N
}
device_2[FIRMWARE_VERSION_1].update(general)
device_2[FIRMWARE_VERSION_2] = {
'DEVICE_2_CONST_1': 1,
'DEVICE_2_CONST_2': 2,
...
'DEVICE_2_CONST_N': N
}
device_2[FIRMWARE_VERSION_2].update(general)
提前感谢您!或者,如果您能指出我可以阅读上述内容的方向,我也将不胜感激。
UPD1:
感谢@languitar,我决定使用 INI/JSON/YAML/TSON... 格式之一。例如,库 python-anyconfig 中支持的格式。格式 INI(由@languitar configparser 提出)看起来很适合我的目的(TSON 似乎也很有趣),但不幸的是,它们都不支持十六进制值。我很惊讶。但我所有的常量都应该有十六进制格式。然后我决定尝试 YAML 格式。现在带有常量的文件如下所示:
# General consts for all devices and all versions
general: &general
GENERAL_CONST_1: 1
GENERAL_CONST_2: 2
...
GENERAL_CONST_N: N
# Particular consts for device_1 for different firmware version
device_1: &device_1
<<: *general
# General consts for device_1 and all firmware versions
DEVICE_1_CONST_1: 1
device_1:
FIRMWARE_VERSION_1:
<<: *device_1
DEVICE_1_CONST_2: 2
...
DEVICE_1_CONST_N: N
FIRMWARE_VERSION_2:
<<: *device_1
DEVICE_1_CONST_2: 2
...
DEVICE_1_CONST_N: N
# Particular consts for device_2 for different firmware version
device_2: &device_2
<<: *general
# General consts for device_2 and all firmware versions
DEVICE_1_CONST_1: 1
device_2:
FIRMWARE_VERSION_1:
<<: *device_2
DEVICE_1_CONST_2: 2
...
DEVICE_1_CONST_N: N
FIRMWARE_VERSION_2:
<<: *device_2
DEVICE_1_CONST_2: 2
...
DEVICE_1_CONST_N: N
但我不确定这是否是为设备及其所有固件版本存储常量的正确方法
【问题讨论】:
-
也许您的常量根本不是常量,您真正需要的是特定于设备的配置,例如使用
configparser模块。 -
@languitar,非常感谢您的回答!对我来说,这似乎是一个有趣的解决方案。我现在会尝试实现它。
-
@languitar,我没有提到,但我应该以十六进制格式存储常量。不幸的是,据我所知,configparser 不支持它。但我尝试了类似的方式(YAML 格式)并相应地更新了我的问题。
-
您可以将十六进制值作为字符串放入配置中,然后将它们解析为数字。不是最好的东西,但也许它有效。另一种选择可能是ConfigObj。
标签: python python-3.x constants