这是一个使用 Python 本身作为描述配置文件的语言的示例:
配置文件
mysettings = [
lambda x: x >= 10,
lambda y: y < 5,
]
主文件
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)
您将执行配置文件中定义的任何功能。
但无论您使用什么语言,我都没有看到任何解决方法:条件是表达式,因此是可执行代码。如果您想最终得到一个可以在代码中使用的 Python 表达式,那么迟早您必须评估该表达式。
编辑:
如果由于某种原因你真的不能使用 Python,那么你可以使用 JSON 中的配置文件来做到这一点:
配置文件
{
"mysettings": {
"color": "Blue",
"expressions": [
"x >= 10",
"y < 5"
]
},
"other_settings": {
"color": "red"
}
}
主文件
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)
结果:
The expression 'x >= 10' evaluates to 'True' for the values {'y': 300, 'x': 42}
The expression 'y < 5' evaluates to 'False' for the values {'y': 300, 'x': 42}
或者,更接近您的示例:
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}