switch not enum python enums

not - python enumerate



python enums con atributos (2)

Python 3.4 tiene un nuevo tipo de datos Enum (que ha sido backported como enum34 y mejorado como aenum 1 ). Tanto enum34 como aenum 2 soportan fácilmente su caso de uso:

[ aenum / 3]

import aenum class EnumWithAttrs(aenum.AutoNumberEnum): _init_ = ''a b'' GREEN = ''a'', ''b'' BLUE = ''c'', ''d''

[ enum34 / 3 o stdlib enum 3.4+]

import enum class EnumWithAttrs(enum.Enum): def __new__(cls, *args, **kwds): value = len(cls.__members__) + 1 obj = object.__new__(cls) obj._value_ = value return obj def __init__(self, a, b): self.a = a self.b = b GREEN = ''a'', ''b'' BLUE = ''c'', ''d''

Y en uso:

--> EnumWithAttrs.BLUE <EnumWithAttrs.BLUE: 1> --> EnumWithAttrs.BLUE.a ''c''

1 Divulgación: soy el autor de Python stdlib Enum , el enum34 backport y la biblioteca de Enumeración avanzada ( aenum ) .

2 aenum también admite NamedConstants y NamedTuples basadas en NamedTuples .

Considerar:

class Item: def __init__(self, a, b): self.a = a self.b = b class Items: GREEN = Item(''a'', ''b'') BLUE = Item(''c'', ''d'')

¿Hay alguna manera de adaptar las ideas para enumeraciones simples a este caso? (ver esta pregunta ) Idealmente, como en Java, me gustaría meterlo todo en una sola clase.

Modelo de Java:

enum EnumWithAttrs { GREEN("a", "b"), BLUE("c", "d"); EnumWithAttrs(String a, String b) { this.a = a; this.b = b; } private String a; private String b; /* accessors and other java noise */ }


Use una táctica nombrada :

from collections import namedtuple Item = namedtuple(''abitem'', [''a'', ''b'']) class Items: GREEN = Item(''a'', ''b'') BLUE = Item(''c'', ''d'')