NameError:名称“a”未定义

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

我用 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
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
子句,但您的代码仍然失败,该子句应该捕获并处理错误,因为您在
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:
块来处理您知道的情况,而不是声明发生了意外错误。

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