【问题标题】:How can I clean up use of exec, can’t get setattr to do the job?如何清理 exec 的使用,无法让 setattr 完成这项工作?
【发布时间】: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 Bnot CD or E and F?
  • 现在它只是布尔规则,但我希望将来允许其他规则,例如“n

标签: python exec eval setattr


【解决方案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

【讨论】:

  • 不过,我认为这不会处理 OP 的情况。据我了解,我们正在尝试测试 "A and B" 等字符串中包含的规则是否成立。
  • @DSM:eval 的使用确实如此(现在已更改,谢谢),但exec 的使用仍然没有必要
  • @DSM:实际上,仔细想想,我认为这不是真的。如果 i 包含字符串 A and B 则 OP 的行 exec(i+" = False") 将永远无法工作
  • 但是现在必须以"self.Options['A'] and self.Options['B']" 的格式指定约束,不是吗?否则eval 将不起作用。
  • @DSM:啊,现在我明白了——Constraints 的值集与 OptionsSelections 不同。在我们得到 OP 的澄清之前,我将删除我的答案
猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 2017-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多