1

我想检查以文本表示的任意(在数据中定义的)规则集,而 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

欢迎任何建议?

4

1 回答 1

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
于 2013-01-20T15:11:25.857 回答