【问题标题】:Is it ever polite to put code in a python configuration file?将代码放在 python 配置文件中是否礼貌?
【发布时间】:2009-03-27 15:26:56
【问题描述】:

我最喜欢 python 的一个特性是你可以用 python 编写易于阅读和理解的配置文件。如果你给自己设置一些界限,你可以非常自信地让非 Python 爱好者确切地知道你的意思,并且完全有能力重新配置你的程序。

我的问题是,这些界限到底是什么?我自己的启发式方法是

  1. 避免流量控制。没有函数、循环或条件。这些不会出现在文本配置文件中,人们也不希望能够理解它们。一般来说,语句的执行顺序可能并不重要。
  2. 坚持字面赋值。在对象上调用的方法和函数更难思考。任何隐含的东西都会变得一团糟。如果您的参数必须发生复杂的事情,请更改它们的解释方式。
  3. 语言关键字和错误处理一目了然。

我想我问这个问题是因为我在 Django 配置文件中遇到了一种情况,打破这些规则似乎很有用。我碰巧喜欢它,但我觉得有点内疚。基本上,我的项目是通过 svn checkouts 部署到几个不同的服务器上,这些服务器的配置并不相同(例如,有些会共享一个数据库,有些则不会)。所以,我在最后抛出一个钩子:

try:
    from settings_overrides import *
    LOCALIZED = True
except ImportError:
    LOCALIZED = False

settings_overrides 在 python 路径上但在工作副本之外。对于这个例子,或者一般的 python 配置边界,你怎么看?

【问题讨论】:

  • "改变他们的解释方式" -> "改变他们的解释方式"。我知道这没关系,但这是一个小问题......

标签: python django


【解决方案1】:

有一个 Django wiki 页面,它准确地解决了您要问的问题。 http://code.djangoproject.com/wiki/SplitSettings

不要重新发明轮子。使用 configparser 和 INI 文件。 Python 文件很容易被不懂 Python 的人破解。

【讨论】:

  • @S.Lott:它们并不完美,但它们是可以用任何语言阅读的标准。有限的?好吧,配置文件不应该嵌入业务逻辑。
  • +1 链接到 wiki 页面...我没看过那个页面,上面有一些好东西。
【解决方案2】:

你的启发式方法很好。制定规则是为了设定界限,只有在明显比替代方案好得多的解决方案时才打破界限。

不过,我还是不禁想知道站点检查代码应该在解析器中,并且添加了一个额外的配置项来选择应该采用哪个选项。

我不认为在这种情况下,替代方案是如此糟糕以至于违反规则是有意义的......

-亚当

【讨论】:

    【解决方案3】:

    我认为这是一个痛苦与快乐的争论。

    将代码放在 Python 配置文件中并没有错误,因为它都是有效的 Python,但这确实意味着您可能会混淆进入重新配置应用程序的用户。如果您对此感到担心,请使用 cmets 将其关闭,大致解释它的作用以及用户不应编辑它,而应编辑 settings_overrides.py 文件。

    对于您的示例,开发人员测试然后部署他们的应用程序几乎是基本。肯定比痛苦更快乐。但是你真的应该这样做:

    LOCALIZED = False
    
    try:
        from settings_overrides import *
    except ImportError:
        pass
    

    在你的 settings_overrides.py 文件中:

    LOCALIZED = True
    

    ...如果只是为了弄清楚该文件的作用..您在那里所做的会将覆盖拆分为两个地方。

    【讨论】:

      【解决方案4】:

      作为一般做法,请参阅页面上的其他答案;这一切都取决于。然而,特别是对于 Django,我认为在 settings.py 文件中编写代码并没有根本性的问题......毕竟,设置文件是代码:-)

      Django docs on settings themselves 说:

      设置文件只是一个带有模块级变量的 Python 模块。

      并举个例子:

      assign settings dynamically using normal Python syntax. For example:
      MY_SETTING = [str(i) for i in range(30)]
      

      【讨论】:

        【解决方案5】:

        设置为代码也是一种安全风险。您导入“配置”,但实际上您正在执行该文件中的任何代码。将配置放入您首先解析的文件中,您可以拒绝无意义或恶意的值,即使它对您来说更有用。我在 2008 年 12 月 blogged 关于这个。

        【讨论】:

        • 这很好。我认为这种特殊情况属于所有编辑都是超级用户的类别,但在一般情况下仍然需要记住。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2017-10-21
        • 1970-01-01
        相关资源
        最近更新 更多