Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Аналог сишного enum в Питоне 
:(
    Опции темы
srd
Дата 25.10.2005, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Как можно в Питоне задать группу именованных констант?


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
grock
Дата 25.10.2005, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 3.8.2005
Где: Санкт - Петербург

Репутация: 1
Всего: 1



не знаю, не помню я enum, но группу именованных констант можно создать исплользуя либо словари, либо создавая два кортежа, в которых будет взаимное соответсвие, т.е. имени идентификатора в одном кортеже будет соответствовать константа в другом, не очень красиво конечно, зато содержимое кортежа изменить нельзя, можно только дополнить
PM MAIL   Вверх
srd
Дата 25.10.2005, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Я имел в виду следующее (пример абстрактный):
Код

enum {Black, White, Blue /*, и так далее */};
int someColor = Balck;
int otherColor = White;    

Здесь значения самих констант не интересны, просто вводится группа идентификаторов, позволяющая различать некоторое понятие. Я так понимаю, в Питоне для этого можно использовать строки?



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
diam
Дата 25.10.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



srd, я не понимаю, зачем тебе это нужно. Аналога enum в Python нет (в этом нет необходимости). Если хочешь, можешь использовать
Код

black = 0
white = 1
blue = 2
# ...

PM MAIL   Вверх
srd
Дата 25.10.2005, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Ну, вот менее абстрактный пример smile Допустим, я пишу игру "Морской бой", в которой есть игровое поле 5x5 клеток, где клетка может быть пустой, либо в ней может находиться корабль. Корабли бывают нескольких видов. Допустим, мне надо завести массив для хранения расположения кораблей на игровом поле на текущем ходе.
Код

/* Вводим идентификаторы для кораблей */
enum Cell {Empty, Corvette, Frigate, Cruiser, Battleship};

/* Игровое поле */
Cell board[5][5] = { { Empty,   Empty,    Frigate, Empty, Empty      }, 
                     { Cruiser, Empty,    Frigate, Empty, BattleShip },
                     { Empty,   Empty,    Empty,   Empty, Empty      },
                     { Empty,   Corvette, Empty,   Empty, Empty      },
                     { Empty,   Empty,    Empty,   Empty, Empty      }, };

Как аналогичные задачи решаются на Питоне? Так писать неудобно, т.к. совершенно не понятно что есть 0, 1 или 2:
Код

board = [ [ 0, 0, 1, 0, 0 ],
          [ 2, 0, 1, 0, 3 ],
           ... и т.д. ...
          [ 0, 0, 0, 0, 0 ] ]

Так писать тоже не удобно:
Код

Empty = 0
Frigate = 1
Cruiser = 2
...
board = [ [ Empty, Empty, Frigate ... ] ... ]

Ибо здесь имена Empty, Frigate - это переменные, а не константы. Т.е. переменнную можно случайно изменить и не обнаружить это, во вторых - сами переменные, как объекты в памяти, явно здесь лишние.
Может просто обойтись строками?
Код

board = [ "Empty", "Frigate", ... ] ... ]

Цитата
я не понимаю, зачем тебе это нужно.

А может быть мне это и не нужно, просто я об этом не знаю smile Просто, зная как решается некоторая задача на известном мне языке, ищу, как эту задачу решить на незнакомом. Кажется в этом и заключается изучение нового языка? smile



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
setq
Дата 25.10.2005, 11:50 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











я не слышал способ создать в Питоне константное имя (которому нельзя присвоить новый объект).

что же касается записи, то недавно решил подобную задачу так:

Цитата
my_enum = '''
LPAREN RPAREN MINUS PLUS EQUAL NAME NUMBER NEWLINE
'''.split ()  # это я подсмотрел в Ruby так делается

for x, name in enumerate (my_enum) :
    exec '%s = %s' % (name,x)


теперь:

Цитата
>>> PLUS
3
>>> my_enum [PLUS]
'PLUS'


я использовал exec потому что в __моём__ случае это было удобнее чем словарь.

в общем... не знаю, то ли это что ты хотел.
  Вверх
srd
Дата 25.10.2005, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 7
Всего: 49



Гм, интересный способ, надо разобраться smile

Цитата(setq @ 25.10.2005, 19:50)
я не слышал способ создать в Питоне константное имя (которому нельзя присвоить новый объект).

Т.е. использование обычных объектов в таком качестве - это в Питоне common practice? Тогда так и буду делать.

Всем ответившим - спасибо.



--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Void
Дата 25.10.2005, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 10
Всего: 173



srd
Немного более удобная запись, но проблемы константности она не решает.
Код
Empty, Corvette, Frigate, Cruiser, Battleship = range(5)



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
diam
Дата 25.10.2005, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 348
Регистрация: 23.1.2005
Где: Екатеринбург

Репутация: 3
Всего: 16



Цитата(Void @ 25.10.2005, 12:24)
srd
Немного более удобная запись, но проблемы константности она не решает.

+1 smile
И не бойся, что случайно присвоишь переменной другое значение smile Это тяжеловато сделать случайно в Python
PM MAIL   Вверх
J2A
Дата 17.11.2005, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 17.11.2005
Где: Омск

Репутация: 16
Всего: 18



Как раз про enum: http://groups.google.com/group/comp.lang.p...9d1d77d605bdba/

В сухом остатке от дискуссии в comp.lang.python: использовать http://aspn.activestate.com/ASPN/Cookbook/...n/Recipe/413486
--------------------
Be easy, stay cool
PM MAIL WWW Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0746 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.