2017-10-18 34 views
1

私は基本的なショッピングカートがあります。私は、書式設定文字列を学習しようとしています - カスタムオブジェクトを:私は何をしたいかhttps://pyformat.info/#custom_1文字列形式のカスタムオブジェクト

はこれです:

print("Your cart contains: {0:short}".format(cart)) 

は返す必要があります。

Your cart contains: cucumbers, tissues, tomatoes, toothpaste 

マイ形式方法が間違っています。

Traceback (most recent call last): 
    File "C:/Users/Mark/PycharmProjects/main/main.py", line 54, in <module> 
    print("Your cart contains: {0:short}".format(cart)) 
TypeError: __format__ must return a str, not NoneType 

は私のコード:

class Item(object): 
    def __init__(self, unq_id, name, price, qty, measure): 
     self.unq_id = unq_id 
     self.product_name = name 
     self.price = price 
     self.qty = qty 
     self.measure = measure 


class Cart(object): 
    def __init__(self): 
     self.content = dict() 

    def __format__(self, format_type): 
     if format == 'short': 
      return ', '.join(item.name for item in self.content) 

    def add(self, item): 
     if item.unq_id not in self.content: 
      self.content.update({item.unq_id: item}) 
      return 
     for k, v in self.content.get(item.unq_id).items(): 
      if k == 'unq_id': 
       continue 
      elif k == 'qty': 
       total_qty = v.qty + item.qty 
       if total_qty: 
        v.qty = total_qty 
        continue 
       self.remove_item(k) 
      else: 
       v[k] = item[k] 

    def get_total(self): 
     return sum([v.price * v.qty for _, v in self.content.items()]) 

    def get_num_items(self): 
     return sum([v.qty for _, v in self.content.items()]) 

    def remove_item(self, key): 
     self.content.pop(key) 


if __name__ == '__main__': 
    cart = Cart() 
    cart.add(Item(1, "Cucumbers", 1., 1, 'kg')) 
    cart.add(Item(2, "Tissues", 1., 2, 'dozen')) 
    cart.add(Item(3, "Tomatoes", 1., 5, 'box')) 
    cart.add(Item(4, "Toothpaste", 1., 5, 'box')) 
    # print("You have %i items in your cart for a total of $%.02f" % (cart.get_num_items(), cart.get_total())) 
    print("Your cart contains: {0:short}".format(cart)) 
    # cart.remove_item(1) 
    # print("You have %i items in your cart for a total of $%.02f" % (cart.get_num_items(), cart.get_total())) 

答えて

1

問題は、あなたの__format__実現である:問題1

def __format__(self, format_type): 
    if format == 'short': 
     return ', '.join(item.name for item in self.content) 
  • :私は入れませんif format == 'short':
    -------------^---------------は - あるべきformat_type

  • 問題2:...(item.name - nameItemクラスにありません。そして

    def __format__(self, format_type): 
        if format_type == 'short': 
         return ', '.join(i.product_name for i in self.content.values()) 
    

    、ラインprint("Your cart contains: {0:short}".format(cart))意志出力:


適切定義

Your cart contains: Cucumbers, Tissues, Tomatoes, Toothpaste