为什么我的 Python exec 命令不起作用?

时间:2021-03-18 00:21:09

标签: python exec eval

我想用“exec”来压缩多行代码。但由于我正在做的项目有些复杂,我会简化我的代码。

假设我想创建一个函数来添加 3 个数字,可以很容易地写成:

def sum3(a,b,c):
    return a+b+c

但是由于我正在处理的项目涉及更多变量和更多动态代码,假设我们希望该函数使用“exec”。我尝试使用它如下:

def suma_eval(a,b,c):
    suma=0
        for item in ("a","b","c"):
        exec(f'''suma+={item}''')
        print(f"""suma+={item}""")
    return suma

Screenshot #1

它不起作用。我做错了什么?

更新 #1:

我已经按照你的指示把它放在一行中,错误停止了,但结果是 0,而它应该是 73。也就是说,该函数没有按预期工作。

Screenshot #2

更新 #2:

我的问题已经解决了,非常感谢,这就是答案:

def suma_eval(a,b,c):
    suma=0
    ldict={}
    for item in ("a","b","c"):
        exec(f'''suma+={item}''',locals(),ldict)
        suma=ldict["suma"]
    return suma

2 个答案:

答案 0 :(得分:0)

因为您在此行之后的代码:for item in ("a","b","c"): 没有缩进。

答案 1 :(得分:-1)

正如评论中所指出的,如果您只需要对元素求和,您可以使用 sum

values = [1, 2, 3, 4, 5]
sum(values)

如果您需要更复杂的行为,您可以查看mapreducefilter。 Reduce 允许您将任何函数累积应用于迭代中的所有项目,并生成单个最终值。

import functools

def customfunc(a, b):
    partial_result = a ** 2 - b
    print(f"{a} {b} -> {partial_result}")
    return partial_result

functools.reduce(customfunc, values)

# prints:
# 1 2 -> -1
# -1 3 -> -2
# -2 4 -> 0
# 0 5 -> -5