我想检查文本中表达的任意(在数据中定义)规则集,而eval()可以很好地完成工作。
e.g。定义规则以检查A和B是否都有效:
Rule = "A and B"
print eval(Rule)
那么如何动态地将值分配给任意一组项目?
我有一个命名选项列表和一个选择列表。选择中的Everthing被视为有效(True),选项中的所有内容都被视为无效(False)。
所以这段代码可以工作,但我不喜欢它,因为我在本地名称空间中设置值,我无法阻止选项名称与我的局部变量发生冲突。
def CheckConstraints(self, Selections):
'Validate the stored constraints'
Good = True
## Undefined options default to False
for i in self.Options:
exec(i+" = False") ## Bad - can I use setattr?
## Set defined Options to True
for i in Selections:
exec(i+" = True") ## Bad - can I use setattr?
for i in self.Constraints:
if not eval( i ):
Good = False
print "Constraint Check Failure:", i, Selections
else:
print "Constraint Check OK:", i, Selections
return Good
我曾尝试使用setattr,但不清楚setattr的设置是什么,eval似乎无法使用设置的值。
我在python 2.7x上
欢迎任何建议?
答案 0 :(得分:1)
eval
可以将字典作为包含新环境的第二个参数。创建一个字典env
并在其中设置新变量,以确保它不会与您的本地命名空间冲突:
def CheckConstraints(self, Selections):
'Validate the stored constraints'
Good = True
env = {}
## Undefined options default to False
for i in self.Options:
env[i] = False
## Set defined Options to True
for i in Selections:
env[i] = True
for i in self.Constraints:
if not eval(i, env):
Good = False
print "Constraint Check Failure:", i, Selections
else:
print "Constraint Check OK:", i, Selections
return Good