【发布时间】:2013-01-20 15:05:01
【问题描述】:
我想检查以文本表示的任意(在数据中定义的)规则集,而 eval() 很好地完成了这项工作。
例如定义一个规则来检查 A 和 B 是否都有效:
Rule = "A and B"
print eval(Rule)
那么如何为任意一组项目动态分配值?
我有一个命名选项列表和一个选择列表。选择中的所有内容都被认为是有效的 (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 上
欢迎提出建议?
【问题讨论】:
-
您的条件是否仅限于针对“变量”的布尔测试?那么
A and B、not C、D or E and F? -
现在它只是布尔规则,但我希望将来允许其他规则,例如“n