在字典中存储逻辑条件并传递给if语句
我有一个包含逻辑条件的字典,比如说 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