【问题标题】:Python: Decent config file formatPython:体面的配置文件格式
【发布时间】:2011-03-01 18:29:27
【问题描述】:

我想使用一种配置文件格式,它支持键值对和可嵌套、可重复的结构,并且语法尽可能简洁。我正在想象以下内容:

cachedir = /var/cache
mail_to = me@example.org

job {
   name = my-media
   frequency = 1 day
   source {
      from = /home/michael/Images

   source { }
   source { }       
}

job { }

我也会对使用重要空白的东西感到满意。

JSON 需要太多明确的语法规则(引号、逗号等)。 YAML 实际上相当不错,但需要将作业定义为 YAML 列表,我觉得使用起来有点尴尬。

【问题讨论】:

    标签: python configuration parsing configuration-files config


    【解决方案1】:

    实际上,我认为 YAML 非常适合此目的:

    jobs:
     - name: my-media
       ...
    
     - name: something else
       ...
    

    或者,作为字典而不是列表:

    jobs:
      my-media:
        frequency: 1 day
        ...
      something-else:
        frequency: 2 day
        ...
    

    您可能没有考虑的另一件事是使用 Python 源代码进行配置。您可以以非常易读的方式嵌套 Python 字典和列表,它提供了多种意想不到的好处。例如,Django 使用 Python 源代码作为其设置文件。

    【讨论】:

    • 感谢 dict 的想法。我更喜欢这种语法而不是列表,没有考虑过这种方法。
    【解决方案2】:

    由于 Python 的内置 configparser 模块似乎不支持嵌套部分,我会先尝试 ConfigObj。 (参见入门教程here)。根据其主页,这是一组值得一提的功能:

    • 嵌套部分(子部分),到任何级别
    • 列出值
    • 多行值
    • 字符串插值(替换)
    • 与强大的验证系统集成
      • 包括自动类型检查/转换
      • 重复部分
      • 并允许使用默认值
    • 写出配置文件时,ConfigObj 会保留所有 cmets 以及成员和节的顺序
    • 许多用于处理配置文件的有用方法和选项(例如“重新加载”方法)
    • 完整的 Unicode 支持

    ConfigObj 被 Bazaar、Trac、IPython、matplotlib 和许多其他大型 Python 项目使用,因此对我来说它似乎非常成熟和稳定(尽管我自己从未使用过)。

    【讨论】:

      【解决方案3】:

      我认为你应该检查 libconfig 库http://www.hyperrealm.com/libconfig/。 应该有python绑定的地方。

      另一种解决方案是使用python本身已经提供的json格式。搜索 JSON 模块的文档。

      【讨论】:

        【解决方案4】:

        为什么要重新发明轮子?您可以使用:

        http://docs.python.org/library/configparser.html

        【讨论】:

        • Configparser 不支持可重复的结构(嗯,不是很简单)
        【解决方案5】:

        如果您的需求超出这些其他选项,您也可以考虑Jsonnet。 Jsonnet 是 JSON 的扩展,乍一看添加了 cmets,放宽了逗号规则,并消除了对如此多的引用的需要。但是,如果您深入了解,您会发现它确实提供了一种功能齐全的编程语言,并且支持通过 mixins、文件导入等进行模板扩展。它有一个 Python 绑定,但它的实际实现是 C++。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多