【问题标题】:Pros and cons for different configuration formats?不同配置格式的优缺点?
【发布时间】:2011-03-06 07:54:16
【问题描述】:

我见过有人使用 *.cfg (Python Buildout)、*.xml (Gnome)、*.json (Chrome 扩展)、*.yaml (Google App Engine)、*.ini 甚至 *.py应用程序配置文件(如 Django)。

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

我知道还有比我举例说明的那些配置文件更多的格式。与彼此相比,它们的真正优势是什么?历史原因?与不同系统的兼容性?

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

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

【问题讨论】:

    标签: python json xml google-app-engine configuration-files


    【解决方案1】:

    主要是个人喜好、目的和可用库。我个人认为 xml 对于配置文件来说太冗长了,但它很受欢迎并且有很好的库。

    .cfg、.ini 是运行良好的旧格式,并且许多语言都有一个可以读取它们的包含库。我已经在 J​​ava、Python、C++ 中使用过它,没有任何问题。它并不能真正用作数据交换格式,如果我要传递数据,我可能会使用相同的格式进行配置和数据交换。

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

    我从未使用过 python 文件作为配置,但它似乎对 django 很有效。它确实允许您在配置中包含一些可能有用的代码。

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

    【讨论】:

    • 了解您的经验很有趣。谢谢!
    • JSON真的是一个对象,把它当成配置文件用起来好像很不对。而且它缺乏正确使用 cmets 的能力。你总是可以为它创建一个 key:value。
    • TOML 现在怎么样了?
    【解决方案2】:

    请注意,这纯粹是我个人的观点和推测,但我怀疑导致格式过多的最大原因可能是缺乏现成的、无所不在的配置文件解析库。缺乏这一点,大多数程序必须编写自己的解析器,因此通常需要在配置结构的复杂程度(分层与扁平、纯数据与 if 语句等嵌入式逻辑等)之间取得平衡,开发人员付出了多少努力愿意花在编写配置文件解析器上,而这对最终用户来说应该是多么痛​​苦。但是,您列出并可能想到的所有原因都可能是一两个项目选择格式的动机。

    对于我自己的项目,我倾向于使用 .ini,只是因为 Python 中已经内置了一个出色的解析器,而且它对于我的大多数用例来说已经“足够好”了。在这两种情况下,它还不够,我使用了基于 XML 的配置文件,同样,由于实现相对简单。

    【讨论】:

    • @mattwilkie 它是 configparser ,用于文档:docs.python.org/3/library/configparser.html
    • 一旦你开始让你的配置文件结构过于复杂,你就错了! INI 解析器内置在 PHP 中,并提供了足够的功能来读取 INI 文件。我的项目中再也不需要更复杂的东西了。
    【解决方案3】:

    这实际上取决于配置文件的读取器/写入器是否是或可以是非程序员,或者它是否具有严格的编程访问权限。

    XML、JSON等,完全不适合人类消费,而INI格式对人类来说还算合理。

    如果配置文件只有编程访问(偶尔由程序员编辑),那么任何支持的格式(XML、JSON 或 INI)都是合适的。 INI 文件不适用于结构化参数,其中 XML 和 JSON 可以支持数组、结构/对象等。

    【讨论】:

      【解决方案4】:

      根据 Python 官方文档,'未来对配置功能的增强将 被添加到 dictConfig()'。

      所以任何可以与 dictconfig() 一起使用的配置文件都应该没问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2011-08-12
        • 1970-01-01
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多