所以我试着在我正在做的这个程序中使用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,
)
1条答案
按热度按时间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 pizzapi
或from pizzapi import Customer
时,它会缓存pizzapi
的定义,在此之后,即使您更改了Customer
的定义,第二个import pizzapi
或from pizzapi import Customer
也不会接受这些更改。一种方法是退出Python进程并重新开始。
另一种方法是使用
importlib.reload
:1.首先确保在运行
reload(pizzapi)
之前运行import pizzapi
(如果尚未运行)。1.然后执行
from importlib import reload
和reload(pizzapi)
。1.最后,您需要从模块中重新运行特定内容的导入,例如
from pizzapi import Customer
。