我正在尝试查看字符串是真还是假但是卡住了...在下面的代码中我创建了一个我要评估的语句列表,我把它们放在字符串中因为变量需要在列表之后声明。(原因是要评估的语句列表作为参数传递给函数,在此函数中声明变量)我想运行列表中的所有项目,如果它是一个真实的陈述,然后做一些事情......这是我的代码:(没有产生输出)
a = ['b > c', 'b = c', 'b < c']
b = 5
c = 3
for item in a:
if exec(item):
print(item)
答案 0 :(得分:4)
exec
是python3.x 1 中的函数,它返回None
,因此您将始终有一个假结果。您可能需要eval
。
这里也要小心。除非你完全信任输入字符串,否则不要使用它,否则它将允许执行任意代码。
请注意,这是一个非常奇怪的代码设计,并且可能是更好的方法来实现您想要的...例如:
为什么要在定义变量之前定义字符串?以这种方式将字符串耦合到代码中的名称可能会导致痛苦的代码维护经验。
1 在python2.x中,由于SyntaxError
是python3.x之前的语句,因此exec
会失败功能
我试图更多地理解你的用例,我建议你创建一个传递函数的API。
def f1(a, b, **kwargs):
return a > b
def f2(a, b, **kwargs):
return a == b
def f3(a, c, **kwargs):
return a <= c
funcs = [f1, f2, f3]
现在您可以定义一个将传递参数的函数。您需要定义它打算传递哪些参数 - 但它总是将它们全部传递出去:
def func_caller(funcs):
param_map = {
'a': get_a_somehow(),
'b': get_b_somehow(),
'c': get_c_somehow(),
...
}
for func in funcs:
if func(**param_map):
print("Hello World!")
还有其他方法可以使func_caller
与它调用的函数之间的“契约”更具约束力(例如将params作为更加结构化的对象传递,如namedtuple
)。
from collections import namedtuple
FuncCallerParams = namedtuple('FuncCallerParams', 'a,b,c')
def f1(func_caller_params):
return func_caller_params.a > func_caller_params.b
...
funcs = [f1, f2, ...]
def func_caller(funcs):
a = ...
b = ...
c = ...
fcp = FuncCallerParams(a, b, c)
for func in funcs:
if func(fcp):
...