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
是一个函数。在zcalc
、parallel
里面是一个列表。在 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)
我写了一个小 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
是一个函数。在zcalc
、parallel
里面是一个列表。在 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)