为什么此dict.get()会引发此错误?

时间:2020-10-13 19:16:53

标签: python python-3.x

我有以下代码(可能不言自明):

def main():
    print("Please input 2 numbers to operate on: ")
    value1 = int(input())
    value2 = int(input())
    print("Please input an operator: ")
    operator = str(input())
    result ={
        '+': lambda x, y: x+y,
        '-': lambda x, y: x-y,
        '*': lambda x, y: x*y,
        '/': lambda x, y: x/y
        }.get(operator(value1, value2), "Error")
    print(result)

if __name__ == "__main__":
    main()

但是我得到了错误:

Please input 2 numbers to operate on:
4
4
Please input an operator:
*
Traceback (most recent call last):
  File "C:\Users\Megapoort\source\repos\Python switch function\Python_switch_function.py", line 17, in <module>
    main()
  File "C:\Users\Megapoort\source\repos\Python switch function\Python_switch_function.py", line 13, in main
    }.get(operator(value1, value2), "Error")
TypeError: 'str' object is not callable

我真的不明白我在这里做错了什么。

5 个答案:

答案 0 :(得分:2)

您将括号放在错误的位置-.get(operator(value1, value2), "Error")operatorvalue1调用value2

您可能是指.get(operator, "Error")(value1, value2),它使用指定的参数正确调用.get的结果。

答案 1 :(得分:1)

这不是您应该使用get的情况,因为实际上没有要使用的默认功能。如果用户输入未定义的运算符,则应该引发异常(不一定是KeyError)或退出。

def main():
    print("Please input 2 numbers to operate on: ")
    value1 = int(input())
    value2 = int(input())
    print("Please input an operator: ")
    operator = str(input())
    try:
        op = {
        '+': lambda x, y: x+y,
        '-': lambda x, y: x-y,
        '*': lambda x, y: x*y,
        '/': lambda x, y: x/y
        }[operator]
    except KeyError:
        sys.exit(f"Invalid operator {operator}")

    result = op(value1, value2)
    print(result)

如果使用get,它还应该返回一个函数。例如,

result = {...}.get(operator, lambda x, y: None)(value1, value2)

答案 2 :(得分:1)

您接近要实现的目标。如果将结果分配语句拆分为单独的步骤,则可能会有所帮助:

首先,在运算符(a str)和lambda之间进行映射,完全等于您的示例:

    operator_map = {
        '+': lambda x, y: x+y,
        '-': lambda x, y: x-y,
        '*': lambda x, y: x*y,
        '/': lambda x, y: x/y,
    }

接下来,获取您的运算符符号所映射的lambda(函数对象),如果输入了未知运算符,则让解释器生成异常:

    func = operator_map[operator]

接下来,使用您先前已阅读的两个操作数调用函数:

    result = func(value1, value2)

如果您真的想将所有内容合并为一个语句:

    result = {
        '+': lambda x, y: x+y,
        '-': lambda x, y: x-y,
        '*': lambda x, y: x*y,
        '/': lambda x, y: x/y,
    }[operator](value1, value2)

提示: 您提供的lambda表达式已在标准库operator module中提供。 lambda x, y: x+y等效于operator.addx-y-> operator.subx*y-> operator.mulx/y lambda等效于operator.truediv

答案 3 :(得分:0)

您的operator = str(input())是一个字符串值。 但是稍后您需要从中获得2个值:operator(value1, value2)那时操作符也是字符串而不是函数,因此操作符()不会在错误旁边产生任何结果。

像这样修复它:

print("Please input 2 numbers to operate on: ")
value1 = 1
value2 = 2
print("Please input an operator: ")
operator = str("+")
result ={
    '+': lambda x, y: x+y,
    '-': lambda x, y: x-y,
    '*': lambda x, y: x*y,
    '/': lambda x, y: x/y
    }.get(operator, "Error")
print(result(value1, value2))

答案 4 :(得分:0)

gsub("http.*", " ", TEXTS)

您在一个语句中做了太多事情。分成小块:

result ={
    '+': lambda x, y: x+y,
    '-': lambda x, y: x-y,
    '*': lambda x, y: x*y,
    '/': lambda x, y: x/y
    }.get(operator(value1, value2), "Error")

现在我们可以看到operations = { '+': lambda x, y: x+y, '-': lambda x, y: x-y, '*': lambda x, y: x*y, '/': lambda x, y: x/y } foo = operator(value1, value2) result = operations.get(foo, "Error") 引起了错误,因为operator(value1, value2)的值是一个字符串,并且在字符串后不能使用括号。相反,我们需要在函数后加上括号。该函数在字典中,您可以使用字符串进行查找:

operator

这个故事的寓意是将一个复杂的陈述分解成较小的部分,以便您可以推理每个小步骤,而不是混淆一个大步骤。