— самолет обходит стороной природу, которую можно посмотреть в пути (заехать туда-то, остановиться-пофотографировать там-то)
— самолет после прибытия с собой в магазин не потащишь, дабы потом покупки на всю семью не в руках тащить (ах да, такси… кстати, сколько там в России штук автомобилей, которые готовы предоставить люльки-автокресла для минимум троих детей?)
> Комфорт — он не в машине, а в голове.
Комфорт он в ощущениях пятой точки, шеи, спины, рук, ног и всего прочего. В тазу, например, я бы не рискнул без длительной стоянки. А уж зимой, когда подогрев либо на правую ногу, либо на левую (но ни при каких обстоятельствах на обе, прям Волга 3110, преемственность технологий же) — даже в соседнюю область опасно.
А особой разницы в голове между временем с детьми в машине и временем с детьми в самолете не замечено.
«Протянуть все гайки-болты-шурупы сразу после покупки» и «проводка, скрепленная изолентой вместо пластиковых хомутиков» — это всё же признак тазика. А уж кто этому тазику крупные узлы для сборки поставляет — вообще без разницы.
Ну, я попытался конструктив, может быть, нашел бы для себя идеальный семейный авто не за втридорога, я всячески подводил Вас к аргументаци. Но у Вас «классовая ненависть» (а не у меня «снобизм», Вы очень плохо себе представляете смысл этого слова).
То есть, большой, вместительный, мягкий и более-менее комфортный семейный автомобиль от 3-4 млн руб. — это роскошь, а «заказать чартер» — нет? Серьезно?
Тем более, я, полагаю, в отличие от своих собеседников, ездил на своем Sharan Москва-Волгоград-Элиста-Пятигорск и обратно. Я вполне себе представляю качество поездок на длительные расстояния в хорошем семейном автомобиле (а не в тазике, который уже в Москве вколотил бы все кочки мне прямо в мозг).
А Вы, между прочим, попробуйте как-нибудь сдать экзамен по альтернативной модели (которая при этом будет иметь сравнимое количество доказательных публикаций по исследованиям). Такие модели в массе есть, например, в биотехе, медицине и, насколько понимаю, физике и астрономии. Да что там альтернативная модель, я слышал, некоторые преподаватели терпеть не любят, когда предмет сдают не по их конспектам (то есть, то же самое, но иными словами). Так что, в реальной жизни все же экзамены, цель которых — получить оценку, все же есть.
> Я и не предлагал (иначе сказал бы «бесплатно», а не «десяток тысяч рублей») — обратитесь в автосервис.
Простите, я ее новую из сервиса (автосалоны, особенно крупные, как правило совмещают в одном здании и сервисную зону и зону продаж) и забрал. Более того, я даже мысли не допускаю, что сервис до передачи авто мне не знал о таком недостатке сборки (не конструктивный недостаток, который и называют «родовая болячка» или чем-то наподобие в автомире) и не устранил самостоятельно. Это опять же, я выполняю чужую работу за свой счет: напомнить сервисменам о необходимости устранить общеизвестные дефекты сборки готового автомобиля (это работа менеджеров, предпродажников, ОТК завода, кого угодно, но не моя).
Кстати, можете поделиться историей успеха с обращением в СЦ в момент передачи авто с требованием устранить дефекты сборки?
Но, помимо дефектов сборки в процитированном отзыве была и куча конструктивных недостатков, опасных для жизни всех в авто. Их Вы почему-то обошли стороной (а обращаться с ними в сервис бесполезно; максимум, на что можно расчитывать — откат сделки продажи авто).
> Что обладать дорогой машиной удобнее, чем ездить на Ларгусе или на общественном транспорте? Так никто не спорит, предметы роскоши вообще часто упрощают жизнь.
Это, похоже, Вы мне пытаетесь доказать, что обычная поездка на отдых всей семьей с хотя бы минимальными комфортом и безопасностью — это роскошь. Оно, конечно, в умах с выученной беспомощьностью, часто именно так и представляется, но вообще-то, не так. Обычная такая потребность. И самому отдохнуть, и супруге из четырех стен выбраться (и не в магазин, а сильно дальше). Я бы скорее отнес это к базовым потребностям человека — просто иметь возможность взять и поехать на отдых на природу.
> Волгоград → Москва → Владимир → Суздаль
Положим, стыковка в Москве в одном и том же аэропорту, но это даже с самолетом ужасно с тремя детьми (один из которых, как мы помним, до года возрастом), на иных представителях общественного транспорта и того ужаснее. И далее от Владимира до Суздали вообще, я так понимаю, предлагается общественной телегой/маршруткой/автостопом добираться? Спасибо, нет.
И Вы так и не показали мне маршрут до Этномира (а я там был с грудным ребенком, отели вполне позволяют с такими там проживать, и даже детскую кровать обеспечивают без проблем). Ах да… Отдых в отпуске в Этномире — роскошь. «Наш человек в булошную на такси не ездит» (с). Местного санатория (пусть и закрывшегося еще в 90-х) хватит всем.
> после покупки надо протянуть болты, пробинтовать кабели и исправить остальные стандартные проблемы
Я даже знать не знаю: ни как держать в руках ключ, ни где эти кабели лежат, ни, тем более, что такое «стандартные проблемы» (которые, подозреваю, от модели к модели разнятся). Тем более не желаю выполнять чужую работу за свои деньги.
> При поездках в сельской местности на небольшие расстояния это всё не так критично, и скорости не те, и машин мало
У нас тут 500+ км и расстояние минимум на весь световой день.
> на большие расстояния лучше ездить на поезде и на самолёте
Можно узнать номер поезда/авиарейса сообщением, к примеру, Белгород — Этномир? Волгоград — Суздаль?
Теперь к Ларгусу. Читаю тут отзыв, пункты категории «минусы»:
1. СТОП ИГРА. В «это» опасно садиться даже водителю. О семье и говорить не стоит.
2. Вкусовщина, компоновка в Сандеро аналогичная, вопрос привычки
3. Вкусовщина, не критично
4. То есть, в поездке примерно на 500км в одну сторону моей семье предлагается дышать придорожной пылью напрямую
5.1. судя по всему, даже на ходовые характеристики не влияет
5.2. СТОП ИГРА. То есть, предлагается постоять приблизительно до лета, пока стекла потеть не перестанут (а иначе просто самоубийственно)
5.3. Хорошо, что ШРУС не может просто взять и развалиться в пути на скорости 80-90км/ч. Хотя, погодите… СТОП ИГРА
6. У меня на Шаране (Алхамбра/Гэлекси) 98-го года выпуска расход и то меньше, а он так-то покрупнее, поувесистее, да и дрыгатель там 2л, в отличие от. Таким образом, предложение купить Гранту содержит в себе спрятанную пасхалку в виде «выкинуть деньги на топливо, но потом» (чем не кредит?)
7. Ну такое…
8. Автор пытается увидеть в Ларгусе VW California, но про отсутствующую в крыше палатку забыл…
9. Это, видимо, просто причина п. 6
10. СТОП ИГРА. Семью в «это» сажать опасно.
11. Кредит в виде дешевых материалов тормозных дисков, аналогичный п. 6
12. Вкусовщина
13. Вкусовщина
14. Вот, действительно, не знаю даже, как к этому относиться. Даже если отбросить просто масляные следы Васянов из Тольятти, с одной стороны, замашки с претензией, а с другой стороны, что там с производства осело на сиденьях и прочих элементах салона, это безопасно трогать, дышать этим?
15. Сам пишет, что единичный случай
16. Немного не понимаю, там что, отсутствует полностью звуковой повторитель указателей поворота, вот это вот щелкающее реле?
Простите, но автомобиль не прошел в категорию «поехать безопасно с семьей». Вывалился из категории с присущей ему и известной обывателям тягой тазов без видимых причин резко поменять траекторию и выйти на встречную полосу аккурат под встречный тридцатитонник.
Давайте я просто спрошу и попрошу дать простой, без уходов в стороны, четкий и как можно более прямой ответ, можно? Спасибо.
Правильно я понимаю, что в Вашем мироощущении слова «автомобиль по цене от 3 миллионов рублей» автоматически рисуют в воображении что-то из серии:
— пушкагонка
— в окнах аквариумы
— аналоговые часы даже в шильдиках на центральных гайках ступиц колёс
— в подлокотнике каждого сидения — мини-бар на 10 обычных винных бутылок
машины ценой с квартиру — предметы роскоши, в отличие от квартиры.
Ага, уж прям Toyota Alphard от 4млн руб или HiAce от 3 (хоть она больше маршрутка, чем семейный авто) для безопасного и комфортного (а потому еще более безопасного) передвижения с женой и детьми (братом, его женой и племянниками) в совместный отпуск — конечно же, роскошь. Дураку же ясно, для семьи из 5 человек достаточно Дэу Нексия. Подумаешь, младший ребенок еще в люльке, а старшего еще по возрасту запрещено на переднее сиденье размещать, потому жена на переднем и остановки каждые 5 км, то подгузники поменять, то напоить-накормить, то еще чего. Подумаешь, путь, который в мягкой и просторной машине делается непринужденно часов за 8, растянулся на 16 и приходится ночевать в непредсказуемом заранее месте, либо "топить до последнего" (таких топтунов обычно в подборках ДТП выкладывают). Зато не ЛАКШЕРИ! Мыж не эти, не бояре проклятые! Ужмемся, потерпим...
И, даже если бы Альфарды в Россию с двухлитровым дизелем возили с ценой, предположим, 3-3.5млн руб, это все равно местами очень близко к однушке даже в Москве.
1. Возможно, это была предыдущая версия ИС Налог, но они не гнушались прямыми махинациями:
— пришли требования по налогам (неверные, в том числе по причине того, что основание льгот сбросилось на рандомное какое-то значение и потому льгота применена некорректно, а сумма налога к оплате исчислена неверно)
— подал заявление на корректировку
— прошел Новый год (крайний срок оплаты без пени и штрафов)
— поскольку исходное требование некорректное, а нового не поступало, оно осталось неоплаченным
— в какой-то момент в середине января проверяю ЛК ФНС, оказывается, «исправленное» требование лежит в ЛК, датированное чуть ли не следующей секундой за моментом подачи мной заявления на корректировку.
Даже скриншоты, вроде бы, сохранились (предполагал такую подставу, надо будет истребовать расчет пеней, если они в этом случае начислились — истребовать перерасчет)
2. Любые телодвижения, которые можно было раньше сделать заявлением в ЛК, теперь требуют ЭП, а аппаратных носителей, которые удовлетворяли бы требованиям к ЭП со стороны налоговой и одновременно требованию неизвлекаемости ключа ЭП (причем так, что это не ограничение драйвера, который просто маскирует файловую систему на носителе, а именно отсутствие аппаратной возможности) я не нашел. Естественно, вариант «налоговая сгенерирует ключ и ЭП за меня и даст ссылку на скачивание» я просто не рассматриваю, потому как ну это уже совсем информационный дауншифтинг какой-то и полный отказ от любой гигиены.
Отсюда вывод: и ФЛ и ЮЛ (ИП) от ЛК в целом ни холодно, ни жарко: все телодвижения так или иначе придется делать ножками в оффлайне. Даже акт сверки, между прочим, только оффлайном, хотя, казалось бы…
Кстати, Арсений, было бы неплохо в рамках этого же BPO решить сразу и вопрос с алиасами (класс-наследник финального перечисления, не объявляющий своих членов перечисления). Схема, описанная нами с "бесшовным" рефакторингом, на мой взгляд, вполне имеет право на жизнь.
У нас есть средства, которые позволяют ограничить непреднамеренное изменение свойств, и как мне кажется этого достаточно.
Так я и говорю: даже эти средства не применяются в данном случае
from enum import Enum
class A(Enum):
pass
class AImpl1(A):
bar = 1
foo = 2
AImpl1.bar.voodoo = 3
from fastenum import fastenum
assert fastenum.enabled
class PatchedEnum(Enum):
foo: str
def __init__(self, value, foo):
self.foo = foo
bar = 1, 'bar'
baz = 2, 'baz'
PatchedEnum.bar.foo = 'foo'
PS. По поводу issue — пока рано. Будем смотреть, на что будут опираться мейнтейнеры при реализации финального патча, основанного на Ваших предложениях. Обычно они самостоятельно бэкпортируют очень годные изменения (а многократное увеличение скорости работы в стандартной библиотеке — именно такое изменение).
При этом, что поразительно: что штатная версия, что ad-hoc патч, что заплатка в PR защищают только и исключительно .name и .value. Установить в рантайме произвольное свойство члена перечисления (даже такое, которое заявлено как часть типа этого перечисления, то есть, устанавливается при инициализации членов перечисления) — не проблема. Это нарушает концепт неизменяемости перечислений. Оставлю это в качестве вопроса личной совести — поднимать ли эту проблему в рамках BPO или нет. Я здесь отдельно оговорю, что защититься в рантайме от object.__setattr__(member, prop_name, prop_val) практически невозможно. Есть лишь возможность защититься от непредполагаемых свойств с помощью __slots__, но это невозможно, если миксин-класс имеет ненулевой __itemsize__ (как, например, int).
Еще хотел бы прояснить отдельно момент: зачем в тестах производительности оценивается dir()? Я не нашел информации о том, что это каким-либо образом является основополагающим вызовом при работе любого рантайма, более того, в Data Model, наоборот, особо подчеркивается, что его основное назначение — отчет о составе объекта при работе в интерактивном режиме интерпретатора.
В любом случае, спасибо за проделанную работу. Как только примут в апстрим (и, надеюсь, разошлют бекпорт-мерджи в 3.6 и 3.7) проанализирую, насколько оно способно полностью заменить нашу реализацию.
ничем немотивированная необходимость использования заглавных имён
Посмотрите enum.EnumMeta.__getattr__. Это то самое место, избежав использования которого мы ускорили доступ к члену перечисления в три раза. Плата совсем небольшая: пусть и не обязательное с точки зрения PEP8, но много где применяемое правило писать имена константных атрибутов классов заглавными буквами.
Пропатчив стандартный Enum можно получить сопоставимые результаты по скорости, сохранив при этом полную совместимость с существующим кодом (выложу как-нибудь такой патч).
Только, если можно, сразу в виде PR сюда и ссылкой в это обсуждение. Спасибо.
Это очень неявно и противоречит принципам pythonic. Насколько я понимаю, 'One' должно записаться в какое-то другое поле, которое надо явно определять через конструктор?
Так наоборот же. Explicit > implicit. Если требуется в value хранить кортеж — пишем этот кортеж как единственное значение явно. Если требуется разбить его на поля в членах Enum — описываем это явно. Какой принцип нарушен? Тем более, в документации это описано.
вы позиционируете ваше решение как замену Enum из stdlib
Мы предлагаем более быструю реализацию перечислений, но не утверждали, что предлагаем эквивалентную реализацию, и уж тем более, как совместимую замену штатному.
а также отличается в API
Одно только отсутствие auto() в таком случае будет приводить к API incompatibility. Но это заявленная несовместимость, не могу понять, что не так?
Может быть нужно было хотя бы создать issue в багтрекере Python, чтобы привлечь внимание к проблеме?
Они в курсе. Только с учетом того, что мы в 3.6 и 3.7 продолжаем испытывать проблемы с производительностью перечислений, они не справились. Их аргумент был — "может поменять public API" (и то, только для предложенного и в итоге принятого патча, что так и не исправило проблему доступа к name и value). Что ж, нам, в свою очередь, ехать, а не шашечки. Как только тот экспериментальный код будет принят в стандартную библиотеку и окажется либо сопоставимым по скорости с нашим, либо еще быстрее, мы с радостью переползем на него.
Лично мне, например, нужен IntEnum, чтобы в cli-приложениях использовать returncode, который не нужно явно приводить к int.
И, что замечательно, Вы, даже если решите воспользоваться FastEnum, продолжите иметь возможность объявить для int-like штатный Enum, в этом конкретном случае Вас вообще никак не затрагивает его скорость работы (лишняя даже секунда на завершение работы приложения — это пустяки). Тем более Вас вряд ли в этом конкретном Enum будет интересовать какая-либо совместимость с FastEnum на уровне сериализации.
Ваше решение имеет серьёзные недостатки: оно ограниченно и несовместимо с Enum из stdlib.
Полную совместимость с stdlib Enum никто и не обещал. Более того, из синтаксиса применения вполне очевидно, что они несовместимы (у нас реализация предоставляет только метакласс, а в стандартной библиотеке — пачка базовых классов)
Что если я хочу хранить в значении NamedTuple?
In [30]: class C(NamedTuple):
...: name: str
...: age: int
...:
In [31]: class B(metaclass=FastEnum):
...: VASYA = C('Vasya', 42),
...: PETYA = C('Petya', 13),
...:
In [32]: B.VASYA
Out[32]: <B.VASYA: C(name='Vasya', age=42)>
In [33]: B.VASYA.value
Out[33]: C(name='Vasya', age=42)
In [34]: B.VASYA.value.name
Out[34]: 'Vasya'
Вы выбросили всю эту функциональность.
Нет, мы ее просто не реализовывали. Список реализованных функций, идентичных тому, что предоставляет стандартная библиотека опубликован. При желании Вы можете через формальное описание логики в init hook написать и свою реализацию mutually exclusive flag-like.
Мне кажется, что более разумно было бы не создавать свой велосипед, которым никто не будет пользоваться кроме вас
Давайте время покажет, будут пользоваться, или нет. Заявлять "никто" только лишь потому, что не реализованы IntEnum и FlagEnum — это равнозначно заявлению, что только и исключительно ими, собственно, и пользуются. А, с учетом того, что все операции так или иначе в них будут проходить через .value, скорости будут настолько впечатляющими, что лучше уж магическими константами, чем с ними. Enum, который используется сам по себе и то лучше выглядит (в случае, если его .name и .value нужны крайне редко). Да я даже тест провел:
In [43]: class F(IntFlag):
...: A = 1
...: B = 2
...: C = 3
...:
In [62]: btime = %timeit -o B.PETYA.value.age | B.VASYA.value.age
140 ns ± 0.451 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [63]: intflag = %timeit -o F.A | F.B
1.15 µs ± 7.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [68]: intflag.average / btime.average
Out[68]: 8.205303629774782
Как видите, те же 8 раз (это при том, что в моем случае с NamedTuple я еще дополнительно поле кортежа доставал)
Да, каждому пользователю библиотеки некоторую автоматизацию того, что уже предоставляется стандартной библиотекой, придется делать самостоятельно. Вполне вероятно, в нас полетят пулл-реквесты, и, может быть, библиотека пополнится наиболее востребованными дополнениями. Но свою главную задачу наша реализация решает: она быстрая, она позволяет исключить иммутабельность в рантайме, она реализует концепт Enum и, в конце концов, она расширяемая.
Дополнительно, в отличие от модуля с константами или класса со статическими атрибутами, Enum (даже штатный) решает очень важную задачу, которую иными средствами решить будет затруднительно: через typing и соответствующие синтаксические конструкции языка можно дать разработчику возможность очень строго контролировать что и где меняется. По той простой причине, что никакую другую аннотацию кроме : int не получится навесить на констату модуля или статический классовый атрибут, если его значение и правда целое число. Как тогда на уровне TYPE_CHECKING хотя бы выводить предупреждения? Enum же можно присваивать "как есть" — то есть, my_obj.obj_attr: StdEnum = StdEnum.ENUM_MEMBER. Поскольку гарантируется, что isinstance(StdEnum.ENUM_MEMBER, StdEnum), тайпчекер поймает любые другие значения, кроме членов нашего Enum. А уж доставать значения из члена уже можно "потом", когда объект планируется передать куда-нибудь наружу (то есть, сериализовать). Причем, в нашей реализации pickle уже поддерживается, равно, как и в штатном Enum.
— самолет обходит стороной природу, которую можно посмотреть в пути (заехать туда-то, остановиться-пофотографировать там-то)
— самолет после прибытия с собой в магазин не потащишь, дабы потом покупки на всю семью не в руках тащить (ах да, такси… кстати, сколько там в России штук автомобилей, которые готовы предоставить люльки-автокресла для минимум троих детей?)
> Комфорт — он не в машине, а в голове.
Комфорт он в ощущениях пятой точки, шеи, спины, рук, ног и всего прочего. В тазу, например, я бы не рискнул без длительной стоянки. А уж зимой, когда подогрев либо на правую ногу, либо на левую (но ни при каких обстоятельствах на обе, прям Волга 3110, преемственность технологий же) — даже в соседнюю область опасно.
А особой разницы в голове между временем с детьми в машине и временем с детьми в самолете не замечено.
— несовпадение подписей коммитов (либо неподписанные коммиты)
Достаточно?
Тем более, я, полагаю, в отличие от своих собеседников, ездил на своем Sharan Москва-Волгоград-Элиста-Пятигорск и обратно. Я вполне себе представляю качество поездок на длительные расстояния в хорошем семейном автомобиле (а не в тазике, который уже в Москве вколотил бы все кочки мне прямо в мозг).
Простите, я ее новую из сервиса (автосалоны, особенно крупные, как правило совмещают в одном здании и сервисную зону и зону продаж) и забрал. Более того, я даже мысли не допускаю, что сервис до передачи авто мне не знал о таком недостатке сборки (не конструктивный недостаток, который и называют «родовая болячка» или чем-то наподобие в автомире) и не устранил самостоятельно. Это опять же, я выполняю чужую работу за свой счет: напомнить сервисменам о необходимости устранить общеизвестные дефекты сборки готового автомобиля (это работа менеджеров, предпродажников, ОТК завода, кого угодно, но не моя).
Кстати, можете поделиться историей успеха с обращением в СЦ в момент передачи авто с требованием устранить дефекты сборки?
Но, помимо дефектов сборки в процитированном отзыве была и куча конструктивных недостатков, опасных для жизни всех в авто. Их Вы почему-то обошли стороной (а обращаться с ними в сервис бесполезно; максимум, на что можно расчитывать — откат сделки продажи авто).
> Что обладать дорогой машиной удобнее, чем ездить на Ларгусе или на общественном транспорте? Так никто не спорит, предметы роскоши вообще часто упрощают жизнь.
Это, похоже, Вы мне пытаетесь доказать, что обычная поездка на отдых всей семьей с хотя бы минимальными комфортом и безопасностью — это роскошь. Оно, конечно, в умах с выученной беспомощьностью, часто именно так и представляется, но вообще-то, не так. Обычная такая потребность. И самому отдохнуть, и супруге из четырех стен выбраться (и не в магазин, а сильно дальше). Я бы скорее отнес это к базовым потребностям человека — просто иметь возможность взять и поехать на отдых на природу.
> Волгоград → Москва → Владимир → Суздаль
Положим, стыковка в Москве в одном и том же аэропорту, но это даже с самолетом ужасно с тремя детьми (один из которых, как мы помним, до года возрастом), на иных представителях общественного транспорта и того ужаснее. И далее от Владимира до Суздали вообще, я так понимаю, предлагается общественной телегой/маршруткой/автостопом добираться? Спасибо, нет.
И Вы так и не показали мне маршрут до Этномира (а я там был с грудным ребенком, отели вполне позволяют с такими там проживать, и даже детскую кровать обеспечивают без проблем). Ах да… Отдых в отпуске в Этномире — роскошь. «Наш человек в булошную на такси не ездит» (с). Местного санатория (пусть и закрывшегося еще в 90-х) хватит всем.
Я даже знать не знаю: ни как держать в руках ключ, ни где эти кабели лежат, ни, тем более, что такое «стандартные проблемы» (которые, подозреваю, от модели к модели разнятся). Тем более не желаю выполнять чужую работу за свои деньги.
> При поездках в сельской местности на небольшие расстояния это всё не так критично, и скорости не те, и машин мало
У нас тут 500+ км и расстояние минимум на весь световой день.
> на большие расстояния лучше ездить на поезде и на самолёте
Можно узнать номер поезда/авиарейса сообщением, к примеру, Белгород — Этномир? Волгоград — Суздаль?
Теперь к Ларгусу. Читаю тут отзыв, пункты категории «минусы»:
1. СТОП ИГРА. В «это» опасно садиться даже водителю. О семье и говорить не стоит.
2. Вкусовщина, компоновка в Сандеро аналогичная, вопрос привычки
3. Вкусовщина, не критично
4. То есть, в поездке примерно на 500км в одну сторону моей семье предлагается дышать придорожной пылью напрямую
5.1. судя по всему, даже на ходовые характеристики не влияет
5.2. СТОП ИГРА. То есть, предлагается постоять приблизительно до лета, пока стекла потеть не перестанут (а иначе просто самоубийственно)
5.3. Хорошо, что ШРУС не может просто взять и развалиться в пути на скорости 80-90км/ч. Хотя, погодите… СТОП ИГРА
6. У меня на Шаране (Алхамбра/Гэлекси) 98-го года выпуска расход и то меньше, а он так-то покрупнее, поувесистее, да и дрыгатель там 2л, в отличие от. Таким образом, предложение купить Гранту содержит в себе спрятанную пасхалку в виде «выкинуть деньги на топливо, но потом» (чем не кредит?)
7. Ну такое…
8. Автор пытается увидеть в Ларгусе VW California, но про отсутствующую в крыше палатку забыл…
9. Это, видимо, просто причина п. 6
10. СТОП ИГРА. Семью в «это» сажать опасно.
11. Кредит в виде дешевых материалов тормозных дисков, аналогичный п. 6
12. Вкусовщина
13. Вкусовщина
14. Вот, действительно, не знаю даже, как к этому относиться. Даже если отбросить просто масляные следы Васянов из Тольятти, с одной стороны, замашки с претензией, а с другой стороны, что там с производства осело на сиденьях и прочих элементах салона, это безопасно трогать, дышать этим?
15. Сам пишет, что единичный случай
16. Немного не понимаю, там что, отсутствует полностью звуковой повторитель указателей поворота, вот это вот щелкающее реле?
Простите, но автомобиль не прошел в категорию «поехать безопасно с семьей». Вывалился из категории с присущей ему и известной обывателям тягой тазов без видимых причин резко поменять траекторию и выйти на встречную полосу аккурат под встречный тридцатитонник.
Правильно я понимаю, что в Вашем мироощущении слова «автомобиль по цене от 3 миллионов рублей» автоматически рисуют в воображении что-то из серии:
— пушкагонка
— в окнах аквариумы
— аналоговые часы даже в шильдиках на центральных гайках ступиц колёс
— в подлокотнике каждого сидения — мини-бар на 10 обычных винных бутылок
Да/нет?
Простите, за "некропостинг" (аж 3 недели!), но:
Ага, уж прям Toyota Alphard от 4млн руб или HiAce от 3 (хоть она больше маршрутка, чем семейный авто) для безопасного и комфортного (а потому еще более безопасного) передвижения с женой и детьми (братом, его женой и племянниками) в совместный отпуск — конечно же, роскошь. Дураку же ясно, для семьи из 5 человек достаточно Дэу Нексия. Подумаешь, младший ребенок еще в люльке, а старшего еще по возрасту запрещено на переднее сиденье размещать, потому жена на переднем и остановки каждые 5 км, то подгузники поменять, то напоить-накормить, то еще чего. Подумаешь, путь, который в мягкой и просторной машине делается непринужденно часов за 8, растянулся на 16 и приходится ночевать в непредсказуемом заранее месте, либо "топить до последнего" (таких топтунов обычно в подборках ДТП выкладывают). Зато не ЛАКШЕРИ! Мыж не эти, не бояре проклятые! Ужмемся, потерпим...
И, даже если бы Альфарды в Россию с двухлитровым дизелем возили с ценой, предположим, 3-3.5млн руб, это все равно местами очень близко к однушке даже в Москве.
— пришли требования по налогам (неверные, в том числе по причине того, что основание льгот сбросилось на рандомное какое-то значение и потому льгота применена некорректно, а сумма налога к оплате исчислена неверно)
— подал заявление на корректировку
— прошел Новый год (крайний срок оплаты без пени и штрафов)
— поскольку исходное требование некорректное, а нового не поступало, оно осталось неоплаченным
— в какой-то момент в середине января проверяю ЛК ФНС, оказывается, «исправленное» требование лежит в ЛК, датированное чуть ли не следующей секундой за моментом подачи мной заявления на корректировку.
Даже скриншоты, вроде бы, сохранились (предполагал такую подставу, надо будет истребовать расчет пеней, если они в этом случае начислились — истребовать перерасчет)
2. Любые телодвижения, которые можно было раньше сделать заявлением в ЛК, теперь требуют ЭП, а аппаратных носителей, которые удовлетворяли бы требованиям к ЭП со стороны налоговой и одновременно требованию неизвлекаемости ключа ЭП (причем так, что это не ограничение драйвера, который просто маскирует файловую систему на носителе, а именно отсутствие аппаратной возможности) я не нашел. Естественно, вариант «налоговая сгенерирует ключ и ЭП за меня и даст ссылку на скачивание» я просто не рассматриваю, потому как ну это уже совсем информационный дауншифтинг какой-то и полный отказ от любой гигиены.
Отсюда вывод: и ФЛ и ЮЛ (ИП) от ЛК в целом ни холодно, ни жарко: все телодвижения так или иначе придется делать ножками в оффлайне. Даже акт сверки, между прочим, только оффлайном, хотя, казалось бы…
Кстати, Арсений, было бы неплохо в рамках этого же BPO решить сразу и вопрос с алиасами (класс-наследник финального перечисления, не объявляющий своих членов перечисления). Схема, описанная нами с "бесшовным" рефакторингом, на мой взгляд, вполне имеет право на жизнь.
Так я и говорю: даже эти средства не применяются в данном случае
PS. По поводу issue — пока рано. Будем смотреть, на что будут опираться мейнтейнеры при реализации финального патча, основанного на Ваших предложениях. Обычно они самостоятельно бэкпортируют очень годные изменения (а многократное увеличение скорости работы в стандартной библиотеке — именно такое изменение).
При этом, что поразительно: что штатная версия, что ad-hoc патч, что заплатка в PR защищают только и исключительно
.name
и.value
. Установить в рантайме произвольное свойство члена перечисления (даже такое, которое заявлено как часть типа этого перечисления, то есть, устанавливается при инициализации членов перечисления) — не проблема. Это нарушает концепт неизменяемости перечислений. Оставлю это в качестве вопроса личной совести — поднимать ли эту проблему в рамках BPO или нет. Я здесь отдельно оговорю, что защититься в рантайме отobject.__setattr__(member, prop_name, prop_val)
практически невозможно. Есть лишь возможность защититься от непредполагаемых свойств с помощью__slots__
, но это невозможно, если миксин-класс имеет ненулевой__itemsize__
(как, например, int).Еще хотел бы прояснить отдельно момент: зачем в тестах производительности оценивается
dir()
? Я не нашел информации о том, что это каким-либо образом является основополагающим вызовом при работе любого рантайма, более того, в Data Model, наоборот, особо подчеркивается, что его основное назначение — отчет о составе объекта при работе в интерактивном режиме интерпретатора.В любом случае, спасибо за проделанную работу. Как только примут в апстрим (и, надеюсь, разошлют бекпорт-мерджи в 3.6 и 3.7) проанализирую, насколько оно способно полностью заменить нашу реализацию.
Посмотрите
enum.EnumMeta.__getattr__
. Это то самое место, избежав использования которого мы ускорили доступ к члену перечисления в три раза. Плата совсем небольшая: пусть и не обязательное с точки зрения PEP8, но много где применяемое правило писать имена константных атрибутов классов заглавными буквами.Только, если можно, сразу в виде PR сюда и ссылкой в это обсуждение. Спасибо.
Впрочем, это был интересный опыт.
Представляю версию 1.3.0, в которой можно вот так:
Только интами не ограничивается, как минимум, тестировалось на
str
,float
(в тесткейс внесено)Так наоборот же. Explicit > implicit. Если требуется в value хранить кортеж — пишем этот кортеж как единственное значение явно. Если требуется разбить его на поля в членах Enum — описываем это явно. Какой принцип нарушен? Тем более, в документации это описано.
Мы предлагаем более быструю реализацию перечислений, но не утверждали, что предлагаем эквивалентную реализацию, и уж тем более, как совместимую замену штатному.
Одно только отсутствие
auto()
в таком случае будет приводить к API incompatibility. Но это заявленная несовместимость, не могу понять, что не так?Они в курсе. Только с учетом того, что мы в 3.6 и 3.7 продолжаем испытывать проблемы с производительностью перечислений, они не справились. Их аргумент был — "может поменять public API" (и то, только для предложенного и в итоге принятого патча, что так и не исправило проблему доступа к
name
иvalue
). Что ж, нам, в свою очередь, ехать, а не шашечки. Как только тот экспериментальный код будет принят в стандартную библиотеку и окажется либо сопоставимым по скорости с нашим, либо еще быстрее, мы с радостью переползем на него.И, что замечательно, Вы, даже если решите воспользоваться FastEnum, продолжите иметь возможность объявить для int-like штатный Enum, в этом конкретном случае Вас вообще никак не затрагивает его скорость работы (лишняя даже секунда на завершение работы приложения — это пустяки). Тем более Вас вряд ли в этом конкретном Enum будет интересовать какая-либо совместимость с FastEnum на уровне сериализации.
Полную совместимость с stdlib Enum никто и не обещал. Более того, из синтаксиса применения вполне очевидно, что они несовместимы (у нас реализация предоставляет только метакласс, а в стандартной библиотеке — пачка базовых классов)
Нет, мы ее просто не реализовывали. Список реализованных функций, идентичных тому, что предоставляет стандартная библиотека опубликован. При желании Вы можете через формальное описание логики в init hook написать и свою реализацию mutually exclusive flag-like.
Давайте время покажет, будут пользоваться, или нет. Заявлять "никто" только лишь потому, что не реализованы IntEnum и FlagEnum — это равнозначно заявлению, что только и исключительно ими, собственно, и пользуются. А, с учетом того, что все операции так или иначе в них будут проходить через
.value
, скорости будут настолько впечатляющими, что лучше уж магическими константами, чем с ними. Enum, который используется сам по себе и то лучше выглядит (в случае, если его.name
и.value
нужны крайне редко). Да я даже тест провел:Как видите, те же 8 раз (это при том, что в моем случае с NamedTuple я еще дополнительно поле кортежа доставал)
Да, каждому пользователю библиотеки некоторую автоматизацию того, что уже предоставляется стандартной библиотекой, придется делать самостоятельно. Вполне вероятно, в нас полетят пулл-реквесты, и, может быть, библиотека пополнится наиболее востребованными дополнениями. Но свою главную задачу наша реализация решает: она быстрая, она позволяет исключить иммутабельность в рантайме, она реализует концепт Enum и, в конце концов, она расширяемая.
Дополнительно, в отличие от модуля с константами или класса со статическими атрибутами, Enum (даже штатный) решает очень важную задачу, которую иными средствами решить будет затруднительно: через typing и соответствующие синтаксические конструкции языка можно дать разработчику возможность очень строго контролировать что и где меняется. По той простой причине, что никакую другую аннотацию кроме
: int
не получится навесить на констату модуля или статический классовый атрибут, если его значение и правда целое число. Как тогда на уровне TYPE_CHECKING хотя бы выводить предупреждения? Enum же можно присваивать "как есть" — то есть,my_obj.obj_attr: StdEnum = StdEnum.ENUM_MEMBER
. Поскольку гарантируется, чтоisinstance(StdEnum.ENUM_MEMBER, StdEnum)
, тайпчекер поймает любые другие значения, кроме членов нашего Enum. А уж доставать значения из члена уже можно "потом", когда объект планируется передать куда-нибудь наружу (то есть, сериализовать). Причем, в нашей реализации pickle уже поддерживается, равно, как и в штатном Enum.