這是使用Python本身作爲語言用於描述配置文件的一個示例:
config.py
mysettings = [
lambda x: x >= 10,
lambda y: y < 5,
]
main.py
from config import mysettings
a = 42
b = 300
for i, condition in enumerate(mysettings):
for value in (a, b):
result = condition(value)
print "condition %s for value %s is: %s" % (i, value, result)
輸出:
condition 0 for value 42 is: True
condition 0 for value 300 is: True
condition 1 for value 42 is: False
condition 1 for value 300 is: False
當然,這是假設的配置文件被認爲是可信的輸入,因爲這樣做condition(value)
你執行任何功能,在配置文件中定義。
但我沒有看到任何解決方法,無論您使用何種語言:條件是expressions,因此可執行代碼。如果你想最終得到一個你可以在你的代碼中使用的Python表達式,那麼你必須遲早評估這個表達式。
編輯:
如果由於某種原因,你真的不能使用Python,這是你如何能夠在JSON配置文件做到這一點:
config.json
{
"mysettings": {
"color": "Blue",
"expressions": [
"x >= 10",
"y < 5"
]
},
"other_settings": {
"color": "red"
}
}
main。PY
import json
x = 42
y = 300
def eval_expr(expr, values):
result = eval(expr, values.copy())
print "The expression '%s' evaluates to '%s' for the values %r" % (
expr, result, values)
return result
f = open('config.json')
data = json.loads(f.read())
settings = data["mysettings"]
for expr in settings['expressions']:
values = dict(x=x, y=y)
eval_expr(expr, values)
結果:
或者,更貼近您的例子:
x = 1
y = 2
values = dict(x=x, y=y)
e1 = settings['expressions'][0]
if eval_expr(e1, values):
# do something
pass
e2 = settings['expressions'][1]
if eval_expr(e2, values):
# do something else
pass
結果:
The expression 'x >= 10' evaluates to 'False' for the values {'y': 2, 'x': 1}
The expression 'y < 5' evaluates to 'True' for the values {'y': 2, 'x': 1}
這與JSON有什麼關係? –
json可用於解析Python eval'able結構 – user248237dfsf
是的,但您顯示的配置格式不是JSON。 –