python - 从 .py 文件加载的 Monkeypatching 硬编码全局配置

标签 python python-2.7

一位同事有一个库,该库使用在其自己的文件中定义的硬编码配置。例如:

常量.py:

API_URL="http://example.com/bogus"

在整个库的其余部分,可以通过以下方式访问配置。

from constants import API_URL

如您所想,这不是很灵活,并且会在测试期间引起问题。如果要更改配置,则必须修改源代码管理中的constants.py。

当然,我更愿意从 JSON 或 YAML 文件加载配置。我可以毫无问题地将配置读入对象。有没有一种方法可以在不破坏代码的情况下覆盖 constants.py 模块,以便每个全局的,例如API_URL 被我的文件提供的值替换了吗?

我想在每个 from constants import ... 之后我可以添加这样的东西:

from constants import *  # existing configuration import
import json
new_config = json.load(open('config.json'))  # load my config file into a dictionary
constants.__dict__.update(new_config)        # override any constants with what I've loaded

当然,问题在于它不是很“干”,而且看起来可能很脆。

有没有人有更干净地做这件事的建议?谢谢!

编辑:看起来我的方法无论如何都行不通。我猜想“from import *”将模块中的值复制到当前模块的全局范围内?

双重编辑:不,它确实有效;我只是很困惑。但是我不想在 X 个不同的文件中执行此操作,而是希望它尽可能透明地工作。

最佳答案

from module import <name>在导入模块全局命名空间中创建对导入对象的引用。如果它是不可变的,则意味着您现在必须对导入它的模块中的值进行 monkeypatch。

您唯一的希望是成为第一个导入常量并猴子修补该模块中的名称的人。随后的导入将使用您的 monkeypatched 值。

要及早修补原始模块,以下内容就足够了:

import constants

for name, value in new_config.iteritems():
    setattr(constants, name, value)

关于python - 从 .py 文件加载的 Monkeypatching 硬编码全局配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18774214/

相关文章:

python - 返回 python 列表中的第一个非 NaN 值

python - `is` 对象标识表示比较 : direct object comparison vs. 比较

python - 运行时错误 : module compiled against API version a but this version of numpy is 9

jquery - Python Selenium 单击按钮

python - DictReader 字段名与 csv 阅读器第一行

python - Airflow cron 计划间隔不触发 DAG

python - 是否可以在 Django 上使用 Python SpeechRecognition?

python - Brython 完全是客户端吗?

python - Matplotlibplot_surface 伪面

python - 从 globals() 访问打印函数