Python 我如何清理exec的使用,can’;你不能让setattr做这项工作吗?

Python 我如何清理exec的使用,can’;你不能让setattr做这项工作吗?,python,exec,eval,setattr,Python,Exec,Eval,Setattr,我想检查一组任意的(在数据中定义的)以文本表示的规则,eval()很好地完成了这项工作 e、 g.要定义检查a和B是否都有效的规则: Rule = "A and B" print eval(Rule) 那么,如何为任意一组项动态赋值呢 我有一个命名选项列表和一个选择列表。选择中的所有内容都被视为有效(True),选项中的所有内容(但不在选择中)都被视为无效(False) 因此,这段代码可以工作,但我不喜欢它,因为我正在本地名称空间中设置值,并且无法防止选项名称与本地变量冲突 def Check

我想检查一组任意的(在数据中定义的)以文本表示的规则,eval()很好地完成了这项工作

e、 g.要定义检查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


欢迎任何建议?

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

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

不过,我认为这不能解决OP的案子。据我所知,我们正在尝试测试像
“A和B”
这样的字符串中包含的规则是否有效。@DSM:对于
eval
(现在已更改,谢谢)的使用是正确的,但是
exec
的使用仍然是错误的unnecessary@DSM当前位置事实上,经过再三考虑,我不认为这是真的。如果
i
包含字符串
A和B
,则OP的行
exec(i+“=False”)
将永远无法工作,但现在必须以
格式“self.Options['A']和self.Options['B']”指定约束,不是吗?否则,
eval
将无法工作。@DSM:Ah,现在我看到-
约束
的值集与
选项
选择
的值集不同。我将删除我的答案,直到我们得到OPI的澄清。不过,我认为这不会处理OP的案件。据我所知,我们正在尝试测试像
“A和B”
这样的字符串中包含的规则是否有效。@DSM:对于
eval
(现在已更改,谢谢)的使用是正确的,但是
exec
的使用仍然是错误的unnecessary@DSM当前位置事实上,经过再三考虑,我不认为这是真的。如果
i
包含字符串
A和B
,则OP的行
exec(i+“=False”)
将永远无法工作,但现在必须以
格式“self.Options['A']和self.Options['B']”指定约束,不是吗?否则,
eval
将无法工作。@DSM:Ah,现在我看到-
约束
的值集与
选项
选择
的值集不同。我将删除我的答案,直到我们从OPAre得到澄清。你的条件仅限于针对“变量”的布尔测试?所以
A和B
不是C
D或E和F
?现在它只是布尔规则,但我希望将来允许其他规则,如“n<6”。您的条件是否仅限于针对“变量”的布尔测试?所以
A和B
不是C
D或E和F
?现在它只是布尔规则,但我希望将来允许使用其他规则,如“n<6”。