【问题标题】:What Type of Settings File to Implement?要实现什么类型的设置文件?
【发布时间】:2011-03-19 08:02:54
【问题描述】:

我正在用 Python (http://sourceforge.net/projects/frozendirectory/) 制作自动存档/备份之类的东西。到目前为止,它使用一个普通的文本文件来存储它的少量设置(但不断增长)。我正在考虑将其更改为 XML 文件,以便它更灵活/可扩展,因此从长远来看更容易使用。但是,当我问朋友时,他建议我将其保存在 python 文件中,例如 settings.py,并在需要时从需要设置的文件中使用“导入设置”。他声称它占用的空间更少,我只需要编写代码来写入设置文件,而不用担心读写。

他的观点令人信服,但让我想知道为什么没有其他大型程序使用他推荐的技术。

所以无论如何,我只是想知道你们的想法。我应该使用 XML、.py 还是其他文件?提前致谢。

【问题讨论】:

    标签: python file settings


    【解决方案1】:

    JSON 是 XML 的一个很好的替代品,它也很容易在 Python 中阅读和。

    【讨论】:

      【解决方案2】:

      我发现ConfigObj 对此非常有用。它类似于 Windows 上常见的“ini”格式,但更灵活。

      您可以为配置标志设置类型和约束。您还可以将默认设置与用户设置合并,即。 用户的配置文件中可能缺少某些设置,这表明应该使用默认值。这使得升级非常无缝,除非您需要对现有设置进行一些神奇的重新解释。

      RabbitVCS 有一个 ConfigObj specification 的示例,this 是实现它的代码。

      【讨论】:

      • 为什么不使用 ConfigParser 模块,它已经包含在 std.distr 中?
      • 我不知道那个模块——我加入时项目正在使用 ConfigObj。它是 2.5 中的新功能吗?
      【解决方案3】:

      他的观点令人信服,但让我想知道 为什么没有其他大型程序使用该技术 他在推荐。

      (Django 使用 settings.py)

      对于我自己的程序...我通常要么使用您提到的 Python 文件,要么使用ConfigParser

      这取决于我的配置文件的受众是谁……是 Python 程序员同事还是非程序员。

      【讨论】:

      • 如果您想将配置参数值存储为列表/元组或字典,那么使用 *.py 非常有用。如果没有,则使用 ConfigParser,将它们作为文本保存在文件中。您可以为不同类型的用户/目的设置多组参数。例如,您可以将不同数据库的设置一起存储在一个文件中,甚至加密的密码;-)
      【解决方案4】:

      谁说大型程序不使用这种技术? :-) 他们这样做,当它有意义的时候。

      为什么会有使用 XML 的趋势?嗯,这是为了解决涉及验证所提供数据的问题,确保多个数据生成器不必相互了解,确保多个读取器将相同地解释数据,将数据的性质封装在数据文件本身中...... . and on and on and on ...

      为什么你的朋友告诉你要避免它?因为对于您的应用程序来说,这可能太麻烦了:-)

      【讨论】:

        【解决方案5】:

        你的朋友可能给了你最好的主意……取决于你的情况。它会很快,对你和程序都很容易,不需要调用额外的库(或者天堂禁止,只为此安装一个)。

        反对使用import 设置文件的最佳论据是“邪恶的黑客”可能会在文件中添加一些代码来干扰程序的工作。再说一次,足够邪恶的人可以用其他东西代替你的整个程序,所以......取决于决心的水平。你需要看看这是否与你的程序目标有关。

        如果您认为这不合适,我认为您可以将您的设置保存在纯文本文件中,前提是它们足够简单(毕竟阅读 INI 样式的设置是单行的,a-la

        settings = dict(s.split('=',1) for s in open('somefile'))
        

        如果您的结构更加结构化,那么 JSON 或 YAML 都应该这样做。另见:

        您可以使用 XML……但这对人类不友好。

        【讨论】:

        • 好的,所以如果我打算使用导入设置路线,我必须实现写入设置 python 文件的功能。您(或其他任何人)是否会碰巧知道一个能够执行此操作的 python 模块,这样我就不必从头开始制作一个?并感谢大家所有的精彩回复!
        【解决方案6】:

        我会说这取决于所存储设置的复杂性和对象或目的。

        如果是我 - 我会使用以下内容作为初始需求评估的基础,然后从那里开始。

        A) 我的数据是否需要多个嵌套层?

        • 是 ---> INI 文件JSONYAML

        • 否 ---> INI 文件JSONYAML

        B) 我需要存储值数组或其他复杂的数据类型吗?

        • YES ---> INI 文件JSONYAML

        • NO ---> INI 文件,JSON,YAML

        C) 我需要将参数映射到实时流吗?

        • YES ---> INI 文件JSONYAML

        • 否 ---> INI 文件JSONYAML

        D) 我是否要在文件中插入或交叉引用键值?

        • 是 ---> INI 文件JSONYAML

        • NO ---> INI 文件JSONYAML

        最后,

        INI 文件很简单,插入参数很容易,但在需要时很难变得更复杂。

        JSON 很好,对嵌套键值或数组对象和数据类型的支持很好。适用于 Web 开发或 JS 对象集成。插值困难,很难在不替换整个对象的情况下主动调整嵌套键值。

        YAML 也不错,我非常喜欢对 python 对象和模块的内部规范的支持。某些数据类型可能有点奇怪,或者不适用于某些版本的 python。数组的嵌套有点奇怪,嵌套有很多键的键值对象可能很繁琐。

        您选择什么取决于您的要求,但通常我通常远离 xml,主要是因为密钥无法以与 JSON 或 YAML 相同的方式提供信息。

        更新:

        我刚刚查看了YAML docs,偶然发现了以下信息,我认为您可能会发现它很有用。

        因此,YAML 可以被视为 JSON 的自然超集,提供更好的人类可读性和更完整的信息- 化模型。实践中也是如此;每个 JSON 文件也是一个有效的 YAML 文件。这使得从 JSON 迁移变得容易 如果/当需要额外的功能时到 YAML

        很酷吧?无论如何,鉴于这些信息,我可能会默认使用 JSON,然后如果我需要转到 YAML。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          • 2014-02-14
          • 2022-11-10
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多