不同配置格式的优缺点?

65 投票
6 回答
35147 浏览
提问于 2025-04-16 00:14

我看到有人使用不同类型的配置文件,比如*.cfg(Python Buildout)、*.xml(Gnome)、*.json(Chrome扩展)、*.yaml(Google App Engine)、*.ini,甚至还有*.py(像Django这样的应用)。

我想问的是:为什么会有这么多不同的配置文件格式?我能理解xml和json的区别(json比xml简洁多了),还有Python格式(有时候你在用Python写应用,不想为了读取配置文件而引入一个特定的模块),但其他格式又有什么用呢?

我知道还有比我举的这些例子更多的格式。它们之间到底有什么优缺点?是历史原因吗?还是为了兼容不同的系统?

如果你要开发一个应用来读取某种配置文件(并且有插件生态系统),你会选择哪种格式?

我举的这些例子中,哪一种是最早的?你知道它的历史吗?

6 个回答

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.'''
7

注意,这只是我个人的看法和猜测,但我觉得各种格式这么多的主要原因,可能是因为没有一个随处可用的配置文件解析库。没有这个库,大多数程序就得自己写解析器,这样就得在配置结构的复杂程度(比如是分层的还是平面的,纯数据还是带有逻辑的,比如if语句等)和开发者愿意花多少精力去写解析器之间找到平衡,同时还要考虑最终用户使用起来是否方便。不过,你提到的每一个原因,可能都曾激励过某个项目选择他们的格式。

在我自己的项目中,我通常使用.ini格式,因为Python里已经有一个很好的解析器,基本上能满足我的大部分需求。如果有几次不够用,我就会用基于XML的配置文件,因为实现起来相对简单。

37

这主要是个人喜好、用途和可用库的问题。就我个人而言,我觉得xml在配置文件中显得太啰嗦了,但它很受欢迎,而且有很多优秀的库可以使用。

.cfg和.ini是老旧的格式,但它们工作得很好,很多编程语言都有内置的库可以读取这些格式。我在Java、Python和C++中都用过,没遇到什么问题。它们并不太适合作为数据交换格式,如果我要传递数据,可能会使用相同的格式来处理配置和数据交换。

yaml和json介于xml和.cfg/.ini之间。你可以在这两种格式中定义很多数据结构,或者像.cfg那样简单地使用键值对。这两种格式在Python中都有很好的库,我想其他很多语言也有类似的库。我相信json是yaml的一个子集。

我从来没有用过Python文件作为配置,但它在django中似乎效果很好。这样做可以在配置中包含一些代码,这可能会很有用。

上次我选择格式时,我选择了yaml。它简单,但有一些不错的功能,而且Python库安装起来很简单,效果也很好。json是一个接近的选择,因为yaml库可以解析json,所以我选择了yaml。

撰写回答