因此,我决定查看 JVM (Java/Scala) 库 ( https://github.com/lightbend/config ) 的文档。阅读文档后,有一个关于 hocon 示例的明确部分(https://github.com/lightbend/config#examples-of-hocon)。在本文档中,他们对 7 种有效的 hocon 样式进行了分类。我称这些样式为,因为如果我要自动生成这些文件,我会选择一种方式来写出来并坚持下去。
所有这些都是有效的 HOCON。
1.从有效的 JSON 开始:
{
"foo" : {
"bar" : 10,
"baz" : 12
}
}
2.删除根大括号:
"foo" : {
"bar" : 10,
"baz" : 12
}
3.删除报价:
foo : {
bar : 10,
baz : 12
}
4.使用=并在{之前省略它:
foo {
bar = 10,
baz = 12
}
5.删除逗号:
foo {
bar = 10
baz = 12
}
6.对不带引号的键使用点符号:
foo.bar=10
foo.baz=12
7.将虚线字段放在一行上:
foo.bar=10, foo.baz=12
因为我将使用 pyhocon 库,所以我需要在库中寻找编写解决方案。我从 chimpler 的 git ( https://github.com/chimpler/pyhocon ) 中找到了一些帮助。我发现它们有两种可以简单写出的 hocon 样式。一个是 json,另一个是上面 lightbend 描述的列表中没有的东西。
Style 1:纯JSON,witch可以用两种方式写出来:
HOCONConverter.to_json
#Using HOCONConverter.to_json
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")
filename = "./json_coverted.conf"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
fd.write(HOCONConverter.to_json(confTree))
HOCONConverter.to_json 结果
{
"Environment": "Dev",
"Test": "${Environment}"
}
或使用 json.dump
#Using json.dump
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")
filename = "./json_dumped.conf"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
fd.write(json.dumps(confTree,indent=4))
使用 json.dump 结果
{
"Environment": "Dev",
"Test": "${Environment}"
}
Pyhocon 的其他风格,lightbend 未列出
# HOCONConverter.to_hocon
confTree = ConfigFactory.parse_string("{}")
confTree.put("Environment","Dev")
confTree.put("Test","${Environment}")
filename = "./hocon_coverted.txt"
print("Write to disk as {}".format(filename))
with open(filename, "w") as fd:
fd.write(HOCONConverter.to_hocon(confTree))
Pyhocon 的其他 Style,未在 lightbend 结果中列出
Environment = "Dev"
Test = "${Environment}"
因此,要回答我自己的问题,在 Python 3 中使用 pyhocon 动态生成 hocon conf 文件的唯一可靠方法是使用其中一种 json 方法(转换器或转储)。但这仍然留下一个悬而未决的问题。问题是,当它们在 json 中时,将 json 读取到 pyhocon ConfTree 对象是否能够取消引用替换?
例如,如果我阅读文件
{
"Environment": "Dev",
"Test": "${Environment}"
}
ConfTree 对象会获得“Dev”作为 Test 的值吗?
不,它不会。这是我的测试
filename = "json_coverted.conf"
print("Reading file{}".format(filename))
conf = ConfigFactory.parse_file(filename)
key="Test"
value=conf.get(key)
print("Key:{} Value:{}".format(key,value))
测试结果输出到屏幕
Reading filejson_coverted.conf
Key:Test Value:${Environment}
那么,如何使用带有替换的 pyhocon 呢?
因此它不能,我不会使用任何一个库来写出 confs。如果我想使用替换,它必须是一个手动过程。所以,我只使用这个库来阅读 confs。