我写了一个小的python脚本,它描述了简单的阻抗网络并计算了有效阻抗。代码是pastebined here。代码按原样运行正确,但是如果你在它们下面的注释掉的行中,它只是将eval移动到zcalc函数,那么代码就不起作用了。它抛出错误:
TypeError: 'list' object is not callable
我使用return eval(equ)
甚至4+2
和parallel([5j,5j])
之类的简单案例测试了一些其中包含parallel([5j,parallel([5j,5j])])
的简单函数,它们可以正常工作。我不确定为什么在其他情况下不会发生错误。
答案 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)