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

python枚举的良好打印

  •  4
  • Dror  · 技术社区  · 6 年前

    假设我有以下几点:

    from enum import Enum
    
    class Color(Enum):
        RED = 1
        GREEN = 2
        BLUE = 3
    

    作为 print(Color) ,我想看看:

    The colors are:
    - RED
    - GREEN
    - BLUE
    

    我试过了:

    from enum import Enum
    
    class Color(Enum):
        RED = 1
        GREEN = 2
        BLUE = 3
    
        @classmethod
        def __str__(self):
            res = "The colors are:\n"
            for g in set(map(lambda c: c.name, Color)):
                res += '- ' + g + '\n'
            return res
    

    但它只起到 print(Color(1)) . 我怎么用它呢 打印(颜色) 是吗?

    1 回复  |  直到 6 年前
        1
  •  7
  •   wim    6 年前

    覆盖打印 ,你可以定义 __str__ 元类 :

    from enum import Enum, EnumMeta
    
    class MyEnumMeta(EnumMeta):
        def __str__(cls):
            lines = [f"The {cls.__name__.lower()}s are:"]
            for member in cls:
                lines.append(f"- {member.name}")
            return '\n'.join(lines)
    
    class Color(Enum, metaclass=MyEnumMeta):
        RED = 1
        GREEN = 2
        BLUE = 3
    

    演示:

    >>> Color
    <enum 'Color'>
    >>> print(Color)
    The colors are:
    - RED
    - GREEN
    - BLUE
    >>> Color.RED
    <Color.RED: 1>
    >>> print(Color.RED)
    Color.RED
    

    类名称被发现:

    >>> class Animal(Enum, metaclass=MyEnumMeta): 
    ...     cat = 'meow' 
    ...     dog = 'woof' 
    ...     badger = 'grrr' 
    ...
    >>> print(Animal)
    The animals are:
    - cat
    - dog
    - badger