缺少1个必需的位置参数(创建对象和初始化字典)

时间:2017-08-14 15:47:24

标签: python dictionary

我之前已经在不同的版本中看到过这个问题,但我觉得好像已经实现了我在这些主题中看到的反馈(主要是确保对象是按照我昨晚做的那样创建的,并且确保字典启动,我觉得我已经在第三行完成了)我仍然收到错误。任何建议将非常感谢。谢谢!

class Groceries:

def __init__(self, grocery_list):
    self.grocery_list = {}

def add_item(self, item):
    item = input("name: ")
    purchased = input(False)
    self.grocery_list[item] = purchased

something = Groceries()
something.add_item()

我得到的错误是:

Traceback (most recent call last):
  File "intermediate_python.py", line 14, in <module>
    something = Groceries()
TypeError: __init__() missing 1 required positional argument: 'grocery_list'

我尝试通过从def init 语句中删除grocery_list来解决此错误(不知道为什么这会起作用,我只是玩游戏)并且错误被移动到下一行:< / p>

Traceback (most recent call last):
  File "intermediate_python.py", line 15, in <module>
    something.add_item()
 TypeError: add_item() missing 1 required positional argument: 'item'

4 个答案:

答案 0 :(得分:1)

要初始化Groceries类的实例,您需要提供在init方法中定义的参数“grocery_list”

class Groceries:
    def __init__(self, grocery_list):
        self.grocery_list = {}

尝试使用以下内容创建您的实例:

something = Groceries({"milk": 1, "butter": 1})

或者,要允许空Groceries对象,可以向init方法添加默认参数,还应该将参数的值赋给变量self.grocery_list,而不是将其分配为空字典:

class Groceries:
    def __init__(self, grocery_list={}):
        self.grocery_list = grocery_list

以及你的方法add_item,你需要传递一个参数或者删除参数(因为你要求它作为输入)

def add_item(self):
    item = input("name: ")
    purchased = input("amount: ")
    self.grocery_list[item] = purchased


something = Groceries({"milk": 0})
something.add_item()
>> name:
>>> milk
>> amount:
>>> 1

答案 1 :(得分:0)

__init__更改为此:

def __init__(self, grocery_list = {}):
    self.grocery_list = grocery_list

这样,如果您提供杂货字典,则将其设置为值,否则为空字典。

答案 2 :(得分:0)

def __init__(self, grocery_list):
self.grocery_list = {}

虽然您正在将grocery_list传递给构造函数,但实际上并没有使用它来设置值。你只需要设置self.grocery_list等于传递的参数grocery_list来解决这个问题,如下所示。

def add_item(self, item):
item = input("name: ")

您还尝试将item作为参数传递,并在函数中手动输入。这意味着无论您向add_item发送什么输入,您都将始终使用用户输入覆盖该值。您可以通过使item参数可选并在提示用户输入之前检查它是否已通过来解决此问题。

purchased = input(False)
self.grocery_list[item] = purchased

此外,还不清楚为什么在请求项目名称后,为了提取输入,将布尔值False隐式转换为字符串作为第二个提示。您似乎想要将某些购买价值设置为True或False,但也不清楚为什么您首先使用字典制作杂货清单,除非您打算将数量包含在字典值中。如果您只是想查看商品是否在购物清单上,您可以使用set()类型而不是dict()。如果您想维持数量,这可以作为一个例子来帮助您前进。

class Groceries:
    def __init__(self, grocery_list={}):
        self.grocery_list = grocery_list

    def add_item(self, item='', qty=1):
        if not item: item = input('name: ')
        if item in self.grocery_list:
            self.grocery_list[item] += qty
        else:
            self.grocery_list[item]  = qty

    def item_qty(self, item=''):
        if not item: item = input('name: ')
        return(self.grocery_list[item])

    def print_all(self):
        for key, val in self.grocery_list.items():
            print(val, key)

something = Groceries()
something.add_item('apple')         # add one apple to groceries
print(something.item_qty('apple'))
something.add_item('apple', 3)      # add three apples to groceries
print(something.item_qty('apple'))
something.add_item()                # add arbitrary item to groceries
something.print_all()               # print all groceries

答案 3 :(得分:0)

如果要创建Groceries类的实例(something = Groceries(*args)),则在初始化结束时,将使用相同的参数列表Groceries.__init__()调用*args函数。

这意味着,当您编写something = Groceries()时,您试图在没有参数的情况下调用__init__函数。另一方面,该函数具有必需的位置参数grocery_list(如果您没有为其提供默认值,则需要任何位置参数。)

由于您的代码无论如何都将grocery_list定义为空字典,因此您不需要将此参数设置为__init__函数,您只需使用:

def __init__(self):
    self.grocery_list = {}

这将解决错误。

或者您可以使用默认值并使用:

def __init__(self, grocery_list={}):
    self.grocery_list = grocery_list

在不提供__init__参数的情况下,您可以使用grocery_list,在这种情况下使用{}。

完全相同的情况适用于add_item函数:您使用必需的位置参数定义它,然后您尝试在没有任何参数的情况下调用它。由于您没有将任何值传递给稍后使用的函数调用中的函数,因此您可以再次删除该参数并使用:

def add_item(self):