我用Python制作了一个简单的calculator.py程序,但是程序失败并显示“NameError:“a”未定义”。
我该如何修复它?
import math
def control(a, x, y, z, k):
return {
'ADDITION': addition(x, y),
'SUBTRACTION': subtraction(x, y),
'MULTIPLICATION': multiplication(x, y),
'DIVISION': division(x, y),
'MOD': modulo(x, y),
'SECONDPOWER': secondPower(x),
'POWER': power(x, y),
'SECONDRADIX': secondRadix(x),
'MAGIC': magic(x, y, z, k)
}[a]
def addition(x, y):
return float(x) + float(y)
def subtraction(x, y):
return float(x) - float(y)
def multiplication(x, y):
return float(x) * float(y)
def division(x, y):
return float(x) / float(y)
def modulo(x, y):
return float(x) % float(y)
def secondPower(x):
return math.pow(float(x), 2.0)
def power(x, y):
return math.pow(float(x), float(y))
def secondRadix(x):
return math.sqrt(float(x))
def magic(x, y, z, k):
l = float(x) + float(k)
m = float(y) + float(z)
return (l / m) + 1.0
try:
control(a, x, y, z, k)
except ValueError:
print("This operation is not supported for given input parameters")
out = control(a, x, y, z, k)
print(out)
输出:
Traceback (most recent call last):
control(a, x, y, z, k)
NameError: name 'a' is not defined
那是因为在 try 循环中运行控制之前,您从未将 'a' 分配给任何东西。尝试在运行控制之前将某些内容分配给“a”。
try:
control(a, x, y, z, k)
您不仅需要为变量 a 赋值,还需要为您在此处传递的其他变量 x、y、z 和 k 赋值 -> control(a, x ,y,z,k)
# For example:
a = 'ADDITION'
x = 1
y = 2
z = 3
k = 4
# And then you can call the function
control(a, x, y, z, k)
变量 a 的值必须是以下之一(如您所定义):
'ADDITION'
'SUBTRACTION'
'MULTIPLICATION'
'DIVISION'
'MOD'
'SECONDPOWER'
'POWER'
'SECONDRADIX'
'MAGIC'
a的任何其他值都会抛出“KeyError”。
尽管现有
try/except
子句应该捕获并处理错误,但您的代码仍会失败,因为您只处理 ValueError
子句中的 except
。其结果是,如果发生 try/except
以外的错误,ValueError
可能会引发错误。
您可以更改
try/except
块,如下面的代码所示,以捕获所有可能的错误。仅逐一取消注释 try:
中的一行,以查看通过 try/ except 子句处理所有可能的错误情况的演示:
import math
def control(a, x, y, z, k):
return {
'ADDITION': addition(x, y),
'SUBTRACTION': subtraction(x, y),
'MULTIPLICATION': multiplication(x, y),
'DIVISION': division(x, y),
'MOD': modulo(x, y),
'SECONDPOWER': secondPower(x),
'POWER': power(x, y),
'SECONDRADIX': secondRadix(x),
'MAGIC': magic(x, y, z, k)
}[a]
def addition(x, y):
return float(x) + float(y)
def subtraction(x, y):
return float(x) - float(y)
def multiplication(x, y):
return float(x) * float(y)
def division(x, y):
return float(x) / float(y)
def modulo(x, y):
return float(x) % float(y)
def secondPower(x):
return math.pow(float(x), 2.0)
def power(x, y):
return math.pow(float(x), float(y))
def secondRadix(x):
return math.sqrt(float(x))
def magic(x, y, z, k):
l = float(x) + float(k)
m = float(y) + float(z)
return (l / m) + 1.0
#try:
# control(a, x, y, z, k)
#except ValueError:
# print("This operation is not supported for given input parameters")
import sys
out = None
try:
# out = control("MAGIC", 2, 3, 4, 5)
# control(a, x, y, z, k)
# control(1, 2, 3, 4, 5)
# control("MAGIC", 2, 0, 0, 5)
control("MAGIC", 2, '3', 'x', 5)
pass
except ValueError:
print("This operation is not supported for given input parameters")
except KeyError:
print(f"Problem: 'a' is not one of 'ADDITION', 'SUBTRACTION', and some other ones (see code) ")
except:
print("An unexpected Error occurred. The program code need to be fixed.")
print(sys.exc_info())
else:
print("See the result below:")
finally:
print(" > here 'finally:' of the try/except block")
print(f'{out=}')
上面的代码在所有情况下都会以退出代码 0 退出,而不是失败并引发异常。
为了进一步改进代码,您应该向其中添加一个
except NameError:
块来处理您知道的情况,而不是声明发生了意外错误。