为什么python认为有6个位置参数,而我只有5个?

f87krz0w  于 2023-01-19  发布在  Python
关注(0)|答案(1)|浏览(237)

所以我试着在我正在做的这个程序中使用Domino的pizza API,但是我想使用用户输入而不是编码的客户数据。

from pizzapi import Customer
address = input("Street Address: ") + ', ' + input('City: ') + ', ' + input('State Abbreviation: ') + ', ' + input('5-Digit Zip Code: ')
customer = Customer(input('First Name: '), input('Last Name: '), input('Email: '), input('Phone Number: '), str(address))
print(customer)

但当我试着运行它时,我得到了这个错误:

customer = Customer(input('First Name: '), input('Last Name: '), input('Email: '), input('Phone Number: '), str(address))
TypeError: Customer.__init__() takes from 1 to 5 positional arguments but 6 were given

我怎样才能消除这个错误?我只输入了5个参数?
编辑:客户模块看起来像这样:

class Customer:
    """The Customer who orders a pizza."""

    def __init__(self, fname='', lname='', email='', phone='', address=None):
        self.first_name = fname.strip()
        self.last_name = lname.strip()
        self.email = email.strip()
        self.phone = str(phone).strip()
        self.str_address = address
        self.address = Address(*address.split(','))

    def save(self, filename="customers/customer1.json"):
        """
        saves the current customer to a .json file for loading later
        """
        if not filename.startswith("customers"):
            filename = "customers/" + filename
        json_dict = {"first_name": self.first_name,
             "last_name": self.last_name,
             "email": self.email,
             "phone": self.phone,
             "address": self.str_address}

        with open(filename, "w") as f:
            json.dump(json_dict, f)

    @staticmethod
    def load(filename):
        """
        load and return a new customer object from a json file
        """
        with open(filename, "r") as f:
            data = json.load(f)

            customer = Customer(data["first_name"], 
                                data["last_name"],
                                data["email"],
                                data["phone"],
                                data["address"])
        return customer

    def __repr__(self):
        return "Name: {} {}\nEmail: {}\nPhone: {}\nAddress: {}".format(
            self.first_name,
            self.last_name,
            self.email,
            self.phone,
            self.address,
        )
zkure5ic

zkure5ic1#

可能需要强制Python加载类所在模块的最新定义。
为了清楚起见,Python说有6个参数,因为它计算的是隐式的self参数。
但真实的奇怪的是,为什么它说它需要1-5个参数,而不是1-6个。您发布的Customer定义在__init__方法中具有正确的参数数量,您报告的错误不会发生。
这表明Python进程使用了不同的Customer定义,我可以想到几种可能性:
1.确保在运行代码之前保存了对pizzapi模块文件的修改(如果你习惯了不保存代码就可以运行的设置,这一点可能不明显,但是大多数Python IDE和原始python命令本身运行的是你保存的代码,而不是编辑器中的代码)。
1.在另一个位置有一个同名的模块正在被首先加载。(可能是您通过复制保存的pizzapi的旧副本?)
1.在代码后面运行的另一个导入从不同的模块获取另一个Customer定义(如果example模块定义了Customer,则from example import *可以完成此操作)。
1.同一模块的旧定义已经缓存在运行的Python进程中(例如,当您使用Jupyter/iPython时,在终端中运行python以获得REPL,或者在IDE中有一个小的活动Python面板)。
你可以很容易地检查第一个问题:执行import pizzapi,然后执行print(pizzapi.__file__)。这将告诉您pizzapi模块正在从哪个文件路径加载。仔细检查该文件是否包含您最新的Customer定义。
第二个同样容易检查:只需要在customer = Customer(...)行之前运行print(Customer.__module__),这将显示该行中使用的Customer来自何处。
一旦第一个和第二个被排除或固定,我们就到了第三个:
当一个Python进程运行import pizzapifrom pizzapi import Customer时,它会缓存pizzapi的定义,在此之后,即使您更改了Customer的定义,第二个import pizzapifrom pizzapi import Customer也不会接受这些更改。
一种方法是退出Python进程并重新开始。
另一种方法是使用importlib.reload
1.首先确保在运行reload(pizzapi)之前运行import pizzapi(如果尚未运行)。
1.然后执行from importlib import reloadreload(pizzapi)
1.最后,您需要从模块中重新运行特定内容的导入,例如from pizzapi import Customer

相关问题