首页 > 解决方案 > 如何访问python文件中的属性并保存回文件

问题描述

我正在使用 Python 3.5 并希望将我的应用程序配置存储在 python 文件中(例如 settings.py)。

示例 settings.py 文件

ALPHA = 0.1
BETA = {}

伪代码

import settings as conf

DEFAULT_ALPHA = 0.234
NEW_BETA = { 1: 2, 2: 'Hello'}

keys = [x for x in dir(conf) if x[0] != '_']

if 'ALPHA' not in keys:
    conf.ALPHA = DEFAULT_ALPHA

if 'BETA' not in keys:
    conf.BETA = {}


if not conf.BETA:
    conf.beta = NEW_BETA


# How to write new configuration to file?

我的问题是我将如何将新配置(settings.py)写入文件?

[[附录]]

正如其他人在评论部分(甚至答案)中指出的那样,这样做的明显方法是使用一种更常见的“结构化数据”格式:即 JSON、YML、XML 等。

我知道 json 模块(过去曾多次使用过它)。但是,我对我在 django 应用程序中看到的代码很感兴趣,它似乎是在直接编辑配置文件(django 爱好者会认出)settings.py)。

我无法弄清楚设置是如何写回文件的,并试图复制它——因此这个问题。FWIW,JSON/YML 方法是我本来会采用的显而易见的方法(过去曾做过几次)。

所以,我的问题仍然存在 - 有没有办法加载 python 模块,修改它,然后将它(模块)保存回文件?

实际上有很多情况下这会很有用。一个这样的例子是一个 django 应用程序,它在安装时实际上会在 settings.py 中进行适当的更改 - 因此无需在INSTALLED_APPS变量 of中添加应用程序,settings.py也无需手动将应用程序配置添加到settings.py.

这将有助于在 django 项目中部署新应用程序,而不必使用当前的变通方法,例如不同版本的 settings.py(例如,用于在 Dockerfile 中复制),甚至不必手动修改 settings.py 文件。

标签: python

解决方案


我建议不要直接导入该配置文件,而是写入函数来加载和保存配置(使用 json):

import json

def loadConfig():
    with open('config.py', 'w+') as configFile:
        try:
            config = json.loads(configFile.read())
        except ValueError:
            config = {}
        except:
            raise
        return config

def saveConfig(config):
    with open('config.py', 'w+') as configFile:
        configFile.write(json.dumps(config))

config = loadConfig()
config["foo"] = "bar"
saveConfig(config)

或者只是使用一个现成的模块,它将为您处理配置文件。


推荐阅读