使用Domino's Pizza API时,为何Python提示传入6个位置参数(实际仅传5个)
我正在开发一个调用Domino's 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个参数,为何会出现这个错误?如何解决?
补充:我自己实现的Customer类代码如下:
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, )
错误原因
这个看似矛盾的错误,大概率是以下两种情况之一:
类导入冲突:你的代码开头导入了
pizzapi库的Customer类,但又自己实现了同名类。如果运行时实际加载的是库中的Customer类,而该类的构造函数参数数量和你自己写的不一致(比如库中的类不需要单独的address参数,而是要求传入拆分后的街道、城市等独立参数),就会导致你传入5个参数时超出了库中方法的参数上限。Address类参数错误的误报:看你自己写的
Customer类构造函数,里面用*address.split(',')把地址字符串按逗号拆分后传给Address类。如果用户输入的街道地址本身包含逗号(比如123 Main St, Apt 4B),拆分后会得到超过4个元素,此时调用Address类时传入的参数数量就会超过它的要求,而Python的错误栈会指向Customer的实例化行,让你误以为是Customer的参数问题。
解决方法
针对两种情况分别处理:
情况1:解决类导入冲突
如果你想使用自己实现的Customer类,删除代码开头的from pizzapi import Customer语句,确保运行时加载的是你自己写的版本。
情况2:修复Address类参数问题
最稳妥的方式是直接收集地址各部分并创建Address对象,避免拼接字符串后拆分的风险:
from pizzapi import Address # 确保导入Address类 # 分别收集地址信息 street = input("Street Address: ") city = input('City: ') state = input('State Abbreviation: ') zip_code = input('5-Digit Zip Code: ') # 直接创建Address对象 address = Address(street, city, state, zip_code) # 创建Customer时传入Address对象 customer = Customer( input('First Name: '), input('Last Name: '), input('Email: '), input('Phone Number: '), address ) print(customer)
同时修改你自己的Customer类构造函数,直接接收Address对象:
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.address = address # 直接赋值Address对象 # 生成字符串格式的地址用于序列化 self.str_address = f"{address.street}, {address.city}, {address.state}, {address.zip}" # 其他方法保持不变
如果坚持用字符串拼接的方式,需要先清理用户输入中的逗号:
# 替换街道地址中的逗号,避免拆分出错 street = input("Street Address: ").replace(',', '') address = f"{street}, {input('City: ')}, {input('State Abbreviation: ')}, {input('5-Digit Zip Code: ')}"
内容的提问来源于stack exchange,提问作者VulnerabilityVigilante

