Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Перелічні типи в Python

with 4 comments

Тисячі їх! Але тут лише троє.

Класичний і найбільш розповсюджений я вже згадував в статті Трюки Пайтона. Він простий і надійний, але з ним правда є проблема – при зміні набору елементів їх треба перераховувати руками, і міняти константу в range().

MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY = range(7)

А тепер трохи ускладнені варіанти. Спочатку мій власний винахід – максимально C-подібний:

>>> def enum(*args):
...     for num,val in enumerate(args):
...         exec('%s = %s' % (val, num), globals(), globals())
...     
... 
>>> enum('monday','tuesday','wednesday', 'thursday', 'friday', 'saturday', 'sunday')
>>> monday == tuesday
False
>>> monday == monday
True
>>> monday < sunday
True
>>> sorted([thursday, saturday, monday, friday])
[0, 3, 4, 5]

Звісно останнє трохи не гарно, але в C вивід був би таким самим. Загалом щойно з’явилась ідея створити клас, що перегружає поведінку чисел, але в __str__ виводить гарний рядок. Ну, і ще, замість globals() треба передавати будь-який простір імен, а globals() залишити за замовчуванням.

А натхнення я черпав із відповіді на stackoverflow:

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0

Тут константами наповнюється клас, який створюється на льоту. Як сказав danbst – “гарне слово лямбда-клас”, тому я буду його називати так. Аби розібратись що таке лямбда-клас – уважно і до кінця читаєте документацію до функції type(). Аж поки не зустрінете фразу “з’явилось у версії 2.2”.

А от в мене на роботі тих перелічних типів справді купа. Для них відведений цілий модуль, і там є на любий смак – словникоподібні, персистентні (серіалізовні), значення яких мають ще додаткові атрибути, і ще ціла купа інших. Мене це збиває з пантелику.

Advertisements

Written by bunyk

Вересень 14, 2011 at 21:45

Оприлюднено в Кодерство

Tagged with

Відповідей: 4

Subscribe to comments with RSS.

  1. Exec? NOWAI! Не пиши такого заради добра:).

    alex.yakushev

    Вересень 15, 2011 at 08:49

    • Я очікував такого коментаря. 🙂

      Можливість стрільби по ногах це ще не причина викинути пістолет.

      bunyk

      Вересень 15, 2011 at 09:35

    • а в чому проблема exec? енуми – це скоріше розширення мови, а мова розширюється не дуже часто, тому проблем буде мінімум

      а на рахунок лямбда-клас – є ще один варіант терміну, анонімний тип. Див сюди, приклади доступні для сприйняття усім http://msdn.microsoft.com/uk-ua/library/bb397696.aspx

      danbst

      Вересень 16, 2011 at 15:39

  2. […] Хах, виявляється сама type() і є класом класів. Тільки як з її допомогою сконструювати клас не маючи його екземплярів? Бо ж зазвичай спочатку є клас, а потім вже його екземпляри. Давайте добре почитаємо документацію. type() з трьома параметрами – конструктор. І він дозволяє нам створювати типи прямо в виразах, на льоту. Прямо як лямбда-функція функції на льоту. Лямбда-клас, ага. […]


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: