exec 是 python3.x1 中的一个函数,它返回 None 所以你总是会得到一个虚假的结果。你可能想要eval。
这里也要小心。除非您完全信任输入字符串,否则不要使用它,否则它将允许执行任意代码。
请注意,这是一个非常奇怪的代码设计,可能有更好的方法来完成你想要的......例如:
为什么要在定义变量之前定义字符串?以这种方式将字符串与代码中的名称耦合可能会导致痛苦的代码维护体验。
1在 python2.x 中,这将失败并返回 SyntaxError,因为 exec 是 python3.x 之前的 语句
在尝试进一步了解您的用例后,我建议您创建一个 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 与其调用的函数之间的“契约”更具绑定性(例如,将参数作为更结构化的对象传递,例如 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):
...