2011-12-25 6 views
1

Используя Python 3, я распаковал код flufl.enum в дерево исходных текстов приложения, чтобы попробовать его. Образец кода:Неожиданно: flufl.enum печатает целочисленное значение

from taurine.flufl.enum import Enum 

class Colors(Enum): 
    red = 1 
    green = 2 
    blue = 3 

print(Colors.red) 
red = Colors.red 
print("red == Colors.red "+str(red == Colors.red)) 
print("red == Colors.blue "+str(red == Colors.blue)) 
print("red is Colors.red "+str(red is Colors.red)) 

Все работает как ожидается, кроме печати (Color.red). Согласно http://packages.python.org/flufl.enum/docs/using.html, я ожидал, что он напечатает «Colors.red», но это печать 1. Кто-нибудь, знакомый с этим пакетом, знает, есть ли способ заставить его печатать «Colors.red»? Я разместил вопрос на сайте библиотеки, но думал, что у кого-то здесь может быть и опыт.

EDIT: Это не работает, как ожидалось, если я определить цвета с:

Colors = make_enum('Colors','red green blue') 

Но я предпочитаю синтаксис:

class Colors(Enum): 
    red = 1 
    green = 2 
    blue = 3 

ответ

3

я понял инициализации не был даже будучи призвал EnumMetaclass. Я думаю, что следующий код в _enum.py предназначен, чтобы сделать унаследовав от Enum все, что вы должны были бы сделать, но что-то об этом не работает, и это за мной:

class Enum: 
    __metaclass__ = EnumMetaclass 

Это работает:

class Colors(metaclass=EnumMetaclass): 
    red = 1 
    green = 2 
    blue = 3 

Я счастлив.

EDIT: Найден почему. См. Первый ответ на следующий вопрос: Shouldn't __metaclass__ force the use of a metaclass in Python?

+1

Хмм. Вероятно, у Python 3 есть предупреждение, когда атрибут \ _ \ _ metaclass \ _ \ _ появляется в определении класса. –

+0

Согласился, это бы быстрее меня подсказало. –

Смежные вопросы