位置引数エラーとその解決

2020-06-02 python-3.x arguments

私はpythonでショッピングカートを実装しようとしていますが、このコードがありますが、エラーは、print_menu関数を呼び出すと、引数が正しくないことです。

    class ItemToPurchase:
    def __init__(self, item_name= 'none', item_price=0, item_quantity=0, item_description = 'none'):

        self.item_name = item_name

        self.item_price = item_price

        self.item_quantity = item_quantity

        self.item_description = item_description

    def print_item_cost(self):

        string = '{} {} @ ${} = ${}'.format(self.item_name, self.item_quantity, self.item_price, (self.item_quantity* self.item_price))

        cost = self.item_quantity * self.item_price

        return string, cost

    def print_item_description(self):

        string = '{}: {}'.format(self.item_name, self.item_description)

        print(string, end=' ')

        return string

class ShoppingCart:

    def __init__(self,customer_name= None ,current_date='January 1,2016',cart_items=[]):

        self.customer_name = customer_name

        self.current_date = current_date

        self.cart_items = cart_items

    def add_item(self):
        print('\nADD ITEM TO CART', end='\n')
        item_name = str(input('Enter the item name:'))
        item_description = str(input('\nEnter the item description:'))
        item_price = int(input('\nEnter the item price:'))
        item_quantity = int(input('\nEnter the item quantity:\n'))
        self.cart_items.append(ItemToPurchase(item_name, item_price, item_quantity, item_description))

    def remove_item(self):
        print()
        print('REMOVE ITEM FROM CART', end='\n')
        string = str(input('Enter name of item to remove:\n'))
        i = 0
        for item in self.cart_items:
            if(item.item_name == string):
                del self.cart_items[i]
                i += 1
                flag=True
                break
            else:
                flag=False
            if(flag==False):
                print('Item not found in cart. Nothing removed.')

    def modify_item(self):

        print('\nCHANGE ITEM QUANTITY', end='\n')
        name = str(input('Enter the item name:'))
        for item in self.cart_items:
            if(item.item_name == name):
                quantity = int(input('Enter the new quantity:'))
                item.item_quantity = quantity
                flag=True
                break
            else:

                flag=False


            if(flag==False):

                 print('Item not found in cart. Nothing modified.')

    def get_num_items_in_cart(self):

        num_items = 0

        for item in self.cart_items:
            num_items += item.item_quantity
        return num_items

    def get_cost_of_cart(self):

        total_cost = 0
        cost = 0
        for item in self.cart_items:

                cost = (item.item_quantity * item.item_price)

                total_cost += cost
        return total_cost


    def print_total(self):

        total_cost = self.get_cost_of_cart()

        if (total_cost == 0):

            print('SHOPPING CART IS EMPTY')

        else:

            self.output_cart()


    def print_descriptions(self):

        print('OUTPUT ITEMS\' DESCRIPTIONS')

        print('{}\'s Shopping Cart - {}'.format(self.customer_name, self.current_date),end='\n')

        print('\nItem Descriptions', end='\n')

        for item in self.cart_items:

            print('{}: {}'.format(item.item_name, item.item_description), end='\n')



    def output_cart(self):

        new=ShoppingCart()

        print('OUTPUT SHOPPING CART', end='\n')

        print('{}\'s Shopping Cart - {}'.format(self.customer_name, self.current_date),end='\n')

        print('Number of Items:', new.get_num_items_in_cart(), end='\n\n')

        self.total_cost = self.get_cost_of_cart()

        if (self.total_cost == 0):

            print('SHOPPING CART IS EMPTY')

        else:

            pass

        tc = 0

        for item in self.cart_items:

            print('{} {} @ ${} = ${}'.format(item.item_name, item.item_quantity,

            item.item_price, (item.item_quantity * item.item_price)), end='\n')

            tc += (item.item_quantity * item.item_price)

            print('\nTotal: ${}'.format(tc), end='\n')

    def print_menu(ShoppingCart):

        customer_Cart = newCart

        string=' '

    #declare the string menu

        menu = ('\nMENU\n'

         'a - Add item to cart\n'

         'r - Remove item from cart\n'

         'c - Change item quantity\n'

         'i - Output items\' descriptions\n'

         'o - Output shopping cart\n'

         'q - Quit\n')

        command = ''

    #Using while loop

    #to iterate until user enters q

        while(command != 'q'):

            string=''

            print(menu, end='\n')

        #Prompt the Command

            command = input('Choose an option: ')

        #repeat the loop until user enters a,i,r,c,q commands

        while (command != 'a' and command != 'o' and command != 'i' and command != 'r' and command != 'c' and command != 'q'):

             command = input('Choose an option: ')

        #If the input command is a

             if(command == 'a'):

            #call the method to the add elements to the cart

                 customer_Cart.add_item(string)

        #If the input command is o

             if(command == 'o'):

            #call the method to the display the elements in the cart

                    customer_Cart.output_cart()

        #If the input command is i

             if(command == 'i'):

            #call the method to the display the elements in the cart

                customer_Cart.print_descriptions()

        #If the input command is i

             if(command == 'r'):

                customer_Cart.remove_item()

             if(command == 'c'):

                customer_Cart.modify_item()

if __name__ == "__main__":
    customer_name = str(input('Enter customer\'s name:'))
    current_date = str(input('\nEnter today\'s date:'))
    print()
    print()
    print('Customer name:', customer_name, end='\n')
    print('Today\'s date:', current_date, end='\n')
    newCart = ShoppingCart(customer_name, current_date)
    newCart.print_menu(newCart)

ShopppingCartクラスのインスタンスを作成しましたが、機能しません。ユーザー入力を取得し、ユーザーがショッピングカートクラスで定義された関数の1つを選択して実装するためのメニューを表示しようとしています。誰かがこの問題を解決するのを手伝ってくれる?

Answers

この問題は、関数の引数ShoppingCartが原因で発生します。最初の引数ShoppingCartを呼び出しました。これは実際にはShoppingCartオブジェクトです。通常、これは自己主張です。 Pythonは、自分の名前を気にしません: selfShoppingCartcorona 。最初の引数は常に関数を呼び出したオブジェクトになります。次のコード行でこの関数を呼び出す場合:

newCart = ShoppingCart(customer_name, current_date)
newCart.print_menu(newCart)

newCartオブジェクトを使用して関数を呼び出し、 newCartオブジェクトを引数として渡します。これを行う必要はありません。 Pythonはすでにオブジェクトを渡しているので、渡す必要はありません。


これはあなたが受け取ったエラーだと思います:

Traceback (most recent call last):
  File "c:/Users/jeffg/Desktop/ProgrammingProjects/StackOverFlow/shoppingcart.py", line 246, in <module>
    newCart.print_menu(newCart)
TypeError: print_menu() takes 1 positional argument but 2 were given

このエラーは、関数が1つの引数のみを取るように定義されているために発生します。あなたは自己主張を説明しませんでした。これを修正するには、コードを次のように変更する必要があります。

def print_menu(self, newCart):
   customer_Cart = newCart

以前に説明したように、newCartオブジェクトに渡す必要はありません。既にselfで newCartオブジェクトにアクセスしているためです。次に、関数を次のようにスリム化できます。

def print_menu(self):

そして、 customer_Cartを使用して関数を呼び出す代わりに、selfを使用できます。

while (command != 'a' and command != 'o' and command != 'i' and command != 'r' and command != 'c' and command != 'q'):
   command = input('Choose an option: ')
   if(command == 'a'):
   self.add_item(string)

また、print_menu()関数内で多数のifステートメントを使用する代わりに、 elifステートメントを使用することをお勧めします。

Related