不同配置格式的优缺点?

Som*_*DOS 32 python xml google-app-engine json configuration-files

我见过人们使用*.cfg(Python Buildout),*.xml(Gnome),*.json(Chrome扩展),*.yaml(Google App Engine),*.ini甚至*.py来获取应用配置文件(像Django).

我的问题是:为什么有这么多不同的配置文件格式?我可以从xml vs json方法(更简洁的方法)或Python方法中看到一个优势(有时你有一个Python应用程序而且不想仅使用特定的模块来解析配置文件),但是另一个呢?方法?

我知道有比我举例说明的那些配置文件更多的格式.与对方相比,他们的优势是什么?历史原因?与不同系统的兼容性?

如果您要启动应用程序来读取某种配置文件(带有插件生态系统),您会使用哪一种?

我举例说哪些是最老的?你知道它的历史吗?

mfp*_*zel 20

这主要是个人偏好,目的和可用的库.就个人而言,我认为xml对于配置文件来说过于冗长,但它很受欢迎并且具有很棒的库.

.cfg,.ini是一种运行良好的遗留格式,许多语言都有一个包含它的库.我已经在Java,Python,C++中使用它而没有任何问题.它并不真正作为数据交换格式工作,如果我传递数据,我可能会使用相同的格式进行配置和数据交换.

yaml和json介于xml和cfg/ini之间.您可以在两者中定义许多数据结构,也可以像cfg一样使用简单的键值.这两种格式在python中都有很好的库,我假设许多其他语言也有库.我相信json是yaml的子集.

我从来没有使用过python文件作为配置,但它确实适用于django.它允许您在配置中包含一些可能有用的代码.

上次我选择格式时,我选择了yaml.它很简单,但有一些很好的功能,python库很容易安装,非常好.Json紧随其后,因为yaml库解析了json,我选择了yaml.

  • JSON实际上是一个对象,将它用作配置文件似乎非常错误.它缺乏正确使用评论的能力.您始终可以创建一个键:值. (4认同)
  • TOML现在怎么样了? (2认同)

Rak*_*kis 6

请注意,这是我的纯粹意见和猜测,但我怀疑过多格式的唯一最大原因可能是由于缺乏一个随时可用的,无所不在的配置文件解析库.缺乏这一点,大多数程序必须编写自己的解析器,因此通常需要在配置结构需要的复杂程度(层次与平面,纯数据与嵌入式逻辑,如if语句等)之间取得平衡,开发人员需要付出多少努力他们愿意花在编写配置文件解析器上,以及最终用户应该感到多么痛苦.但是,您列出并且可能认为的所有原因可能都是一两个项目选择其格式的动机.

对于我自己的项目,我倾向于使用.ini只是因为Python中已经内置了一个优秀的解析器,并且对于我的大多数用例来说它已经"足够好"了.在这两种情况下,它已经不够用了,我已经使用了基于XML的配置文件,这也是因为实现的相对简单性.


tei*_*ura 5

另一个可行的选择是toml,它是另一种“介于 ini 和 xml 之间”的格式。

如今,toml 在 Python 中已经成熟——从 Python 3.11 开始,tomllib就包含在 Python 标准库中。它是一个只读解析器,但官方文档提到了外部读写库。

toml 有什么好处?

# Toml prioritize human-readability, allowing comments.

[ section-1 ]
key = "value pair" # is basic.
"Thus looks" = "like ini."

list = ['And', 'arrays', 'are supported, too' ]
dict = { "json-like": "dict type is",
         "available": {
             "too.": "But this is",
             "very": "readable."
         }
       }

[ types ]
number.int = 123
numbers.hex = 0xABCD
numbers.float = 3.14e-16

local.date = 2023-06-28
local.time = 12:34:56

[ others ]
longline = '''Lorem
Ipsum Foo
Bar baz'''

comment = '''This could've been specified as others.comment.
See the official document for the details.'''
Run Code Online (Sandbox Code Playgroud)