Python用存储在其他文件中的变量覆盖配置文件



假设我有一个名为main_config.pycustom_config.py的文件。它们都在同一个模块中。

我想做的是有两个单独的配置文件,其中一个(主)是版本控制的,另一个(自定义)是.gitignore 'd,允许不同的设置有自己的配置与main文件用作模板。

下面的代码曾经在Python 3.5上正常工作,但我被迫恢复到2.7,它不再像预期的那样工作。我做错了什么?我在exec上得到KeyError: 'client2'异常。

main_config.py目录:

class MainConfig(object):
    clients = {
        "client1" = {
            "IP" = "127.0.0.1",
            "User" = "admin"
        }
    }
    try:
        with(open(__file__.replace("main_config.py", "custom_config.py")) as source_file:
            exec(source_file.read())
    except IOError, e:
        print("No custom config detected")

custom_config.py目录:

from (...).main_config import MainConfig
MainConfig.clients["client2"]["IP"] = "0.0.0.0"
MainConfig.clients["client2"]["User"] = "root"

我看到你用字典和=符号代替:

除此之外,你不能在IP之前没有分配client2,所以你的代码可能看起来像这样:

main_config.py

class MainConfig(object):
    clients = {
        "client1" : {
            "IP" : "127.0.0.1",
            "User" : "admin"
        }
    }
    try:
        with(open(__file__.replace("main_config.py", "custom_config.py")) as source_file:
            exec(source_file.read())
    except IOError, e:
        print("No custom config detected")

custom_config.py

    from (...).main_config import MainConfig
if 'client2' not in MainConfig.clients.keys():
    MainConfig.clients["client2"] = {}
MainConfig.clients["client2"]["IP"] = "0.0.0.0"
MainConfig.clients["client2"]["User"] = "root"

我不解释如何解决您遇到的特定错误(其他答案已经这样做了),但我想指出有更适合您的用例的配置语言。具体来说,Figura本机支持这种可重写性。

下面是一个例子:

# main_config.py
class MainConfig:
    class clients:
        class client1:
            IP = "127.0.0.1"
            User = "admin"
# custom_config.py
class CustomConfig:
    # declare this config is meant to be applied as an override to another
    __override__ = True
    class client2:
        IP = "0.0.0.0"
        User = "root"

并将它们组合在你的代码中:

from figura import build_config
full_config = build_config('main_config.MainConfig', 'custom_config.CustomConfig')

灵活的build_config函数将第一个参数作为基本配置,其余的作为应用于它的覆盖。

全面披露:我是figura的作者。

最新更新