Имеются весомые контраргументы + бонус (немножно изучил вопрос).
andylars 03.06.2016 23:56
называется это @ломание обратной совместимости...
...^хэш.method[0] и ^хэш.method(0) будут делать разные по сути вещи
1.Не вижу ломания обратной совместимости. Если вы используете символы цифр, чтобы имитировать то, что нативно невозможно (массива то нет), т.е. фактически сделали "отдельную проекцию цифр" на ключи хеша, то как это не назови, но [0] - это "хак", который впрочем не ломается.
2.Структуры (модели) данных более высокого порядка, образуются путем композиции и сочетания более элементарных структур. Тут Python, пожалуй, самый опорный пример, т.к. это его конёк - атомары данных из которых собирается всё многообразие и гибкий доступ к ним. Та же парсеровская таблица, была бы просто list of tuples - список кортежей.
3.MoKo - прав, если мы имеем порядок ключей, но не можем управлять этим порядком - академически это не правильно. Или давайте тогда "восстановим справедливость" и наделаем базовых примитивов, которых нет и из-за которых все немного хромает на одну ногу:
- list (array) = список упорядоченных элементов с доступом по индексу,
- dict (hash) = ассоциативный массив с доступом по имени ключа
- tuple = кортеж (фиксация размера и порядка элементов)
- set/frozenset = (то, что добавляет операции union/intersection для dict)
- collection = композиции list,tuple,dict и set + iterator и counter = дает исчерпывающее многообразие: очереди, стеки, доступы по ключу, индексу, вставки, итерации (курсор), в общем full house.
По принципу "утиной типизации" (duck-typing) - парсеровский хеш это питоновский collection.OrderedDict, но только не оперившийся и поэтому всё еще немного "гадкий утёнок". Но всего +2 методами он даже может закрыть даже питоновскую очередь (
https://docs.python.org/2/library/collections.html#collections.deque)
Бонус(!), вот как выглядит его взрослая версия - следите за руками :)
(я просто оставлю это здесь, скопировав из консоли + #допечатанные_комментарии)
~$: python
Python 2.7.3 (default, Jun 22 2015, 19:33:41)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import collections
>>> d = collections.OrderedDict()
>>> d['KeyA'] = 'ValueA'
>>> d['KeyB'] = 'ValueB'
>>> d.items()
[('KeyA', 'ValueA'), ('KeyB', 'ValueB')]
>>> d['KeyA'] # доступ по ключу
'ValueA'
>>> d['KeyB']
'ValueB'
>>> d.items()[0] # доступ по индексу
('KeyA', 'ValueA')
>>> d.items()[1]
('KeyB', 'ValueB')
>>>
>>> d.keys().index('KeyA') # получение индекса по ключу
0
>>> d.keys().index('KeyB')
1
>>> d.keys()[0] # получение ключа по индексу
'KeyA'
>>> d.keys()[1]
'KeyB'
>>> d.update({'KeyA':'ValueAA'}) # добавление/изменение
>>> d.update({'KeyC':'ValueC'})
>>> d.items()
[('KeyA', 'ValueAA'), ('KeyB', 'ValueB'), ('KeyC', 'ValueC')]
>>> d.popitem() # забрать последний элемент (как из стека)
('KeyC', 'ValueC')
>>> d.items()
[('KeyA', 'ValueAA'), ('KeyB', 'ValueB')]
Поэтому, как бы смысла обсуждать теоритическую часть:
"можно ли смешивать ключи и индексы" - вроде и нет, пример выше чуть более, чем убедительный, учитывая насколько широко в продакшене и в мире используется - Python 2.x
"Парсеровский хеш" сейчас по всем признакам - OrderedDict, но хромой на очевидные методы и работы с индексами, которые однозначно должен уметь, раз заявился на порядок элементов.
Я даже не агитирую за похожий, как в примере питоновский update (хотя и заикнулся, о "вставке с перетиранием", в первой версии "формализации", но легко можно "облезть без него". А вот минимальный набор из предложенных 2 методов + 2 апдейтов - существующих,
это явно must have. Тем более, что закрывает так много.
Поэтому, тут только 2 варианта развития:
Или Перетанцевать всю иерархию примитивов данных (маловероятный на практике)
Или Докрутить пару методов и пару апдейтов для существующих, получив на выходе намного более полноценный и мощный инструмент (тем более, что ниша для Парсера, явно в сторону более высокуровневых абстракций, внизу ему делать нечего).
Можно еще оставить всё как есть, но тогда это уже не "развитие".
- Есть ли какой-то ловкий способ изменить имя ключа в hash, с сохранием его места (по индексу)., andylars 28.05.2016 12:28
- и всё, что-ли? даже в top3 самых больших тредов не добрались! %-) (-), Misha v.3 [M] 16.06.2016 10:15
- Ответ, moko [M] 16.06.2016 14:28
- Огласите top :) (-), andylars 16.06.2016 11:24
- Ответ, Misha v.3 [M] 16.06.2016 14:29 / 16.06.2016 14:30
- Ответ, moko [M] 30.05.2016 00:59
- Всмысле это предложение или уже недокументированная возможность в ночных сборках?, andylars 30.05.2016 11:04 / 30.05.2016 11:05
- Ответ, moko [M] 30.05.2016 12:38
- Методы для работы с порядком элементов в хеше..., Sumo [M] 06.06.2016 11:05 / 06.06.2016 11:06
- Ответ, G_Z [M] 06.06.2016 15:13
- Ответ, moko [M] 06.06.2016 13:48
- Можно вообще не делать новый метод вставки. а расширить add..., Sumo [M] 06.06.2016 14:03
- Ответ, Sumo [M] 06.06.2016 14:00
- Ответ, moko [M] 06.06.2016 14:29
- Ответ, moko [M] 06.06.2016 14:23
- Если «нестандартный вариант» кажется проблемой, то можно и иначе..., Sumo [M] 06.06.2016 15:09
- Ответ, moko [M] 06.06.2016 22:10
- От add - ожидаешь, что он сохранит физ.смысл = сложение/слияние ключей. Картинки прилагаются., andylars 07.06.2016 00:28 / 07.06.2016 00:50
- put это эффективный add одного элемента, moko [M] 07.06.2016 00:43
- Я однозначно не понимаю, как вы сочетаете add и before/after, andylars 07.06.2016 01:00
- Если перестать думать про ключи и значения, то все встает на вои места..., Sumo [M] 07.06.2016 06:29
- Я таки осознал, что надо наоборот - перестать думать об add, как overlapping-методе для множества, тем более, что он выбивается из стройного ряда. (-), andylars 08.06.2016 09:50
- Поэтому, дополнить операции со множествами - операциями с рядами, можно только органически подобными по механике, иначе imho каша., andylars 07.06.2016 10:33 / 07.06.2016 10:51
- Именно так я и воспринимал. Словарь - это множество. А массив - это ряд. И операции для них работают по-разному., andylars 07.06.2016 10:03
- Ответ, G_Z [M] 07.06.2016 02:01
- Ответ, G_Z [M] 06.06.2016 23:14
- Страшновато глазами пользователя... http://www.parser.ru/forum/?id=83206, andylars 06.06.2016 16:18 / 07.06.2016 00:37
- Мне так OK, moko [M] 06.06.2016 15:21
- Вопрос семантики: begin/end будут точнее first/last, но само поведение какое-то нелинейное получается. (-), andylars 06.06.2016 14:27
- Re: Ответ (updated), andylars 06.06.2016 12:08 / 06.06.2016 13:07
- Ответ, Sumo [M] 06.06.2016 13:14
- Как черновой вариант формализации..., andylars 31.05.2016 15:44 / 31.05.2016 23:22
- Ответ, moko [M] 01.06.2016 18:51
- Мудрёно, G_Z [M] 01.06.2016 00:16
- Ответ, andylars 01.06.2016 09:45 / 01.06.2016 09:47
- А еще получить индекс ключа, зная название ключа, как-то реально без перебора всех записей? (-), 28.05.2016 17:16