带有 .py 文件的配置文件

Config file with a .py file

有人告诉我,这样做 不太好 做法(虽然它出现在 Python pattern for sharing configuration throughout application 的主要答案中):

configfile.py

SOUNDENABLED = 1
FILEPATH = 'D:\TEMP\hello.txt'

main.py

import configfile

if configfile.SOUNDENABLED == 1:
    ....

f = open(configfile.FILEPATH, 'a')
...

许多人使用 INI 文件与 ConfigParser module or iniparse 或其他类似模块进行本地配置这一事实证实了这一点。

问题:为什么使用 INI 文件进行本地配置 + INI 解析器 Python 模块比仅导入包含正确配置值作为常量的 configfile.py 文件更好?

这是完全可以接受的做法。使用此方法的一些知名项目示例是 Django and gunicorn.

导入模块会执行它包含的任何代码。没有什么限制您的 configfile.py 只包含定义。归根结底,这是安全问题和模糊错误的根源。此外,您必须使用 Python 的模块搜索路径来查找配置文件。如果你想把配置文件放在别的地方,或者有名字冲突怎么办?

由于某些原因可能会更好

  1. 配置文件的唯一扩展名是 py
  2. 除非你将 __init__.py 放入此目录
  3. ,否则你不能在单独的目录中分发带有配置的程序
  4. 恶意用户可以将任何 python 脚本放入配置中并做坏事。

例如,YouCompleteMe 自动完成引擎将配置存储在 python 模块 .ycm_extra_conf.py 中。默认情况下,每次导入配置时,它都会询问您是否确定该文件可以安全执行。

  1. 如何在不重启应用的情况下更改配置?

通常,允许执行来自外部某处的代码是一个漏洞,可能会导致非常严重的后果。

但是,如果您不关心这些,例如,您正在开发仅在您的服务器上执行的 Web 应用程序,那么将配置放入 python 模块是一种可接受的做法。 Django 这样做了。

这里唯一的问题是 .py 可以有任意 Python 代码,因此它有可能以任意方式破坏您的程序。

如果您相信您的用户会负责任地使用它,那么此设置没有任何问题。事实上,at one of my previous occupations, we were doing just that, without any problems that I'm aware of.恰恰相反:它允许用户通过自动生成重复部分和导入其他配置文件来消除重复。

另一个问题是如果你有很多文件,配置文件最好与常规代码文件分开,这样用户就知道他们应该能够编辑哪些文件(上面的 link 解决了这个问题,也是)。