これは、構成ファイルを記述するための言語として 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)
ます。これを行うことで、構成ファイルで定義されている関数を実行するからです。
しかし、使用している言語に関係なく、それを回避する方法はありません。条件は式であり、したがって実行可能コードです。コードでそのまま使用できる 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)
結果:
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}