【问题标题】:TypeError: Calculator.main() takes 5 positional arguments but 6 were givenTypeError: Calculator.main() 接受 5 个位置参数,但给出了 6 个
【发布时间】:2021-12-09 20:29:01
【问题描述】:
import math


class Calculator():
    def __init__(self, num1=0.0, op=None, num2=0.0, result=None):
        self.num1 = num1
        self.op = op
        self.num2 = num2
        self.result = result

    def main(self, num1, op, num2, result):
        if op == "+":
            result = float(num1) + float(num2)
            print(result)
        elif op == "-":
            result = float(num1) - float(num2)
            print(result)
        elif op == "*":
            result = float(num1) * float(num2)
            print(result)
        elif op == "/" and float(num2) == 0:
            result = None
            print("You can't divide by zero")
            p.main(self, num1, op, num2, result)
        elif op == "/" and float(num2) != 0:
            result = float(num1) / float(num2)
            print(result)
        elif op == "power":
            result = float(num1)**float(num2)
            print(result)
        else:
            print("invalid input")


while True:
    p = Calculator()
    p.main(num1=input("Write a number: "),
           op=input("+ or - or * or / or power: "),
           num2=input("Write another number: "),
           result=None)
    ans = input("Would you like to do another equation: ")
    if ans == "yes":
        p.main()
        ans = input("Would you like to do another equation: ")
    elif ans == "no":
        exit()

我尝试将 5 除以 6 以测试一切是否正常,但出现此错误:

Traceback(最近一次调用最后一次): 文件“d:\Visual Studio Code\Projects\HelloWorld python\tempCodeRunnerFile.py”,第 37 行,在 p.main(num1=input("写一个数字:"), 文件“d:\Visual Studio Code\Projects\HelloWorld python\tempCodeRunnerFile.py”,第 24 行,在 main p.main(self, num1, op, num2, 结果) TypeError: Calculator.main() 接受 5 个位置参数,但给出了 6 个

【问题讨论】:

  • 这个程序适用于我,在 python 3.8 中没有例外。我运行了一些输入并将漂亮的答案打印到控制台。
  • 与错误无关,但为什么result是函数的参数?
  • 这是因为 OP 仍处于混乱阶段,他们正在弄清楚函数/OOP 如何工作。我相信他们会到达那里。 :P
  • @Samwise 我同意。我的评论只是朝着正确的方向轻推。

标签: python


【解决方案1】:

这一行:

            p.main(self, num1, op, num2, result)

应该是:

            self.main(num1, op, num2, result)

然而,这将引发一个不同的错误,即通过使用相同的参数调用相同的函数,您会得到相同的结果,这是对相同函数的另一个调用(然后重复大约一千次,直到递归引发错误)。相反,你需要提示用户输入新的输入;处理错误的函数应该是接受用户输入的函数。

让这件事变得简单的一种方法是使用异常,如果你只是除以零并让它引发ZeroDivisionError,它实际上会自动发生。只需让接受输入的代码捕获该异常,以便它可以重新提示用户:

class Calculator():
    def operate(self, num1: float, op: str, num2: float) -> float:
        """Perform one operation according to the value of op.
        May raise ValueError or ZeroDivisionError."""
        if op == "+":
            return num1 + num2
        elif op == "-":
            return num1 - num2
        elif op == "*":
            return num1 * num2
        elif op == "/":
            return num1 / num2
        elif op == "power":
            return num1 ** num2
        else:
            raise ValueError(f"invalid operator {op}")

    def do_one_equation(self) -> None:
        """Prompt the user for input and do one equation.
        Loop on invalid input until we have one successful result."""
        while True:
            try:
                result = self.operate(
                    float(input("Write a number: ")),
                    input("+ or - or * or / or power: "),
                    float(input("Write another number: "))
                )
                print(result)
                return
            except ZeroDivisionError:
                print("You can't divide by zero")
            except ValueError:
                print("Invalid input")


p = Calculator()
while True:
    p.do_one_equation()
    if input("Would you like to do another equation: ") == "no":
        break

请注意,在上面的代码中,result 变成了 returnoperate() 方法生成的任何内容。函数的参数是它的输入,结果应该是它的输出(即你return的东西)。

【讨论】:

  • 是的,该行会导致错误,但无论如何该行毫无意义。
  • @eljokoir 这就是为什么我说“这条线无论如何都没有意义”。你应该点击链接到 Samwise 给出的答案。
猜你喜欢
  • 1970-01-01
  • 2018-06-21
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 2021-02-02
相关资源
最近更新 更多