功能内部的Eval导致错误,而外部则没有

时间:2015-02-04 17:44:22

标签: python eval

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

TypeError: 'list' object is not callable

我使用return eval(equ)甚至4+2parallel([5j,5j])之类的简单案例测试了一些其中包含parallel([5j,parallel([5j,5j])])的简单函数,它们可以正常工作。我不确定为什么在其他情况下不会发生错误。

1 个答案:

答案 0 :(得分:1)

zcalc之外,parallel是一个函数。在zcalc内,parallel是一个列表。在eval内调用zcalc,它将尝试访问列表而不是函数。考虑更改其中一个的名称,因此没有歧义。实施例

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)