我用 Python 做了一个简单的 calculator.py 程序,但是程序失败并出现 NameError: "a" is not defined.
我该如何解决?
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
子句,但您的代码仍然失败,该子句应该捕获并处理错误,因为您在 except
子句中仅处理 ValueError
。其结果是,如果发生 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:
块来处理您知道的情况,而不是声明发生了意外错误。