在字典中存储逻辑条件并传递给if语句

1 投票
2 回答
7218 浏览
提问于 2025-04-18 03:49

我有一个包含逻辑条件的字典,比如说 a == 1,我想在 if 语句中用来进行判断。虽然这可能不太可能,但我想确认一下。以下是示例代码:

z = {'var1':['a == 1'],
     'var2':['b == 3']
    }
a = 6
b = 20

#If I use the dictionary value in an if statement like this:

if z['var1']:
    print 'TRUE'
else:
    print 'FALSE'

#It will always evaluate as true.  What I want is for the statement to
#translate into the following form:

if a == 1:
    print 'TRUE'
else:
    print 'FALSE'

我一直在尝试各种 if 语句的组合、列表推导和字符串处理,但没有找到能解决这个问题的办法。如果真的不行,我也想知道。如果有更好的方法,我也想了解一下。提前谢谢大家的回答。

2 个回答

7

你可以把函数存放在一个字典里:

z = {'var1': lambda a, b: a == 1,
     'var2': lambda a, b: b == 3,
    }

if z['var1'](a, b):
    print 'TRUE'

# etc.

我在这里用了lambda函数,不过完整的函数也可以用。

5

你想要存储一个表达式,可以使用内置的 eval() 函数(如果你想玩玩语句的话,可以用 exec)。

>>> a = 6
>>> b = 3

>>> z = {
        'var1':eval('a == 1'),
        'var2':eval('b == 3'),
    }

>>> if z['var1']:
        print "True!"
    else:
        print "False!"
False!

>>> if z['var2']:
        print "True!"
    else:
        print "False!"
True!

注意,在你创建字典里的表达式之前,必须先给变量赋值,因为表达式是在运行时被计算的。如果变量在内存中不存在,就会出现 NameError 错误。

>>> eval(foo)
NameError: name 'foo' is not defined

另外要小心,如果你允许用户输入任意字符串作为 eval() 的参数,这可能会很危险。更多信息可以在 这里 找到。

简单解释一下为什么你原来的代码总是返回 True,你的 if 语句正在评估的布尔表达式是一个包含一个字符串的列表。Python 会把所有非空的序列都当作 True 来处理,所以条件成立,字符串 TRUE 就被打印出来了。

>>> z['var1']
['a == 1']

>>> bool(z['var1'])
True

撰写回答