错误“NameError:名称“a”未定义”

问题描述 投票:0回答:3

我用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
python calculator nameerror
3个回答
0
投票

那是因为在 try 循环中运行控制之前,您从未将 'a' 分配给任何东西。尝试在运行控制之前将某些内容分配给“a”。

try:
    control(a, x, y, z, k)

0
投票

您不仅需要为变量 a 赋值,还需要为您在此处传递的其他变量 xyzk 赋值 -> 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”。


0
投票

尽管现有

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:
块来处理您知道的情况,而不是声明发生了意外错误。

© www.soinside.com 2019 - 2024. All rights reserved.