带有后备数据的 .py 配置文件?

.py config file with fallback data?

我的项目中有一个 settings.py 文件:

"Nickname of the user to check the games for"
USERNAME = "user"

不幸的是,它会被每次升级覆盖。因此,我想允许用户通过创建 .py 文件 $XDG_CONFIG_HOME/myapp/config.py 来覆盖默认设置,例如包含

USERNAME = "real-user"

是否可以修改 settings.py 以便它以通用方式从 .../config.py 文件中吸取任何变量,比如在 config.py 末尾包含此文件?

我正在使用 Python 3

我假设您从 settings.py 文件中获取值的方式是 importing 它:

import settings

print(settings.USERNAME)

然后你可以通过在末尾添加类似这样的东西来改变它,这将做你想要的。

settings.py

"Nickname of the user to check the games for"
USERNAME = "user"

def _read_overrides(filename):
    localdict = {}  # populated by exec
    try:
        with open(filename) as file:
            exec(compile(file.read(), filename, 'exec'),
                 {'__builtins__': None}, localdict)
    except FileNotFoundError:
        pass

    return localdict

for key, value in _read_overrides('config.py').items():
    globals()[key] = value

然后在 imported 之后,print(settings.USERNAME) 将显示:

real-user

另请注意,config.py 覆盖文件可以任意命名(它不需要 .py 扩展名)。