假设我有一个名为main_config.py
和custom_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的作者。