Eval 在函数内部会导致错误,而在函数外部则不会

Eval Inside Of Funtion Results In Error, While Outside It Does Not

我写了一个小 python 脚本,它接受简单阻抗网络的描述并计算有效阻抗。代码已粘贴 here。代码按原样正确运行,但如果您在它们下面的注释掉的行中进行子操作,这只是将 eval 移动到 zcalc 函数,则代码不起作用。它抛出错误:

TypeError: 'list' object is not callable

我测试了几个简单的函数,其中包含 return eval(equ),使用简单的情况,例如 4+2,甚至 parallel([5j,5j])parallel([5j,parallel([5j,5j])]),它们都有效。我不确定为什么在其他所有情况下都不会发生错误。

zcalc之外,parallel是一个函数。在zcalcparallel里面是一个列表。在 zcalc 中调用 eval,它将尝试访问列表而不是函数。考虑更改其中之一的名称,这样就不会产生歧义。例如

def zcalc(equ):
        equ = filter(equ)
        pos = equ.find('|')
        while pos != -1:
                parallel_seq = []
                temp_pos = pos
                while True:     #gather all scopes to the left into list
                        lpos = leftscope(equ, temp_pos)
                        parallel_seq.insert(0, equ[lpos:temp_pos])
                        if (lpos == 0): break
                        elif (equ[lpos-1] != "|"): break
                        temp_pos = lpos-1
                temp_pos = pos
                while True:     #gather all scope to the right into list
                        rpos = rightscope(equ, temp_pos)
                        parallel_seq.append(equ[temp_pos+1:rpos+1])
                        if (rpos == len(equ)-1) or (equ[rpos+1] != "|"): break
                        temp_pos = rpos+1
                new_equ = "parallel(["
                for i in parallel_seq:      #create string for paralleled function
                        new_equ = new_equ + i + ","
                equ = equ[0:lpos] + new_equ[:len(new_equ)-1] + "])" + equ[rpos+1:]      #replace parallelized part of string with parallel string
                pos = equ.find("|")
        #return equ
        return eval(equ)