代码之家  ›  专栏  ›  技术社区  ›  MarkS

字符串格式自定义对象

  •  1
  • MarkS  · 技术社区  · 8 年前

    我有一个基本的购物车。我正在尝试学习字符串格式——自定义对象: 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 回复  |  直到 8 年前
        1
  •  1
  •   RomanPerekhrest    8 年前

    问题在于你的 __format__ 实现:

    def __format__(self, format_type):
        if format == 'short':
            return ', '.join(item.name for item in self.content)
    
    • 问题1: if format == 'short':
      -------------^--------------- -应该是 format_type

    • ...(item.name -没有属性 name Item


    正确的定义:

    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