Обновить
5
0

gamedev / devops

Отправить сообщение

В целом паттерн матчинг был заимствован из раста, где он как раз-таки сочетается с его необычными enum-ами и позволяет их эффективно деконструировать. В принципе часть моей мотивации для написания этой мини-библиотеки это начать заменять массивы if-ов на match-и.

В тестах нет ни единого ассерта. Они точно что-то тестируют?

https://github.com/girvel/rust_enum/blob/master/tests/test_enums.py#L15

https://github.com/girvel/rust_enum/blob/master/tests/test_enums.py#L16

Сдалайте GitHub actions с матрицей питонов погонять тесты. Заодно примеры обновите для 3.6.

Не думаю что это эффективное вложение времени, учитывая что это библиотека из 17 строк и она теряет половину полезности без pattern matching из 3.10. Но вообще на 3.6 это действительно не будет работать без датаклассов, которые появились в 3.7, я записал себе issue.

Выше я приводил пример работы с enum через typing и подробно расписал почему это худшее решение.

Поправил чтобы было проще читать на хабре.

В Kotlin существует неявная переменная it, используемая в сокращённых лямбдах. В JQuery есть $. В циклах рутинно используются однобуквенные переменные, несмотря на то что зачастую эти циклы бывают довольно большими и это даже в какой-то степени вредит читаемости. В принципе использование сокращений переменных в современном питоне является минимальным нарушением стиля кода, вот например двухбуквенная переменная в кодовой базе джанго, которую я нашёл за две минуты. Правилом "нельзя использовать однобуквенные переменные" можно легко пренебречь, особенно если это сокращение распространённое, задокументированное и с ним знакомы все разработчики. Программирование это не религия, в нём нет догм, и в некоторых ситуациях слепое следование правилам приводит к ухудшению качества кода.

Также возможное решение, но оно требует ощутимо больше шаблонного кода.

  1. Generally discouraged. Если это return и он помещается в 120 символов, то это дело личного предпочтения.

  2. Функция буквально также возвращает None

  3. Это является плохим неймингом в отрыве от проекта; в рамках проекта есть ощутимое количество математики с векторами, из-за чего были заимствованы сокращения в математическом стиле, и d и p являются специфическими для проекта терминами. В документации есть табличка со списком всех терминов специфичных для проекта. Сокращения имён переменных специфичные для предметной области это распространённая практика в питоне. Например, в пандас это df.

Обычные Enum по умолчанию не поддерживают вложенные типы. Enum раста по сути является объединением enum-а и union-а, что на практике показало себя как очень удобное решение.

Это альтернативное решение, но в данном случае оно кажется мне менее удобным. Например, через стандартные аннотации питона, поддерживающие алгебраические типы данных, мне приходит в голову следующее решение:

class TargetChange:
    Nothing = object()
    To = NewType("To", Optional[int2])

TargetChangeType = TargetChange.Nothing | TargetChange.To

Субъективно это менее компактно и менее читаемо, надо прописывать все члены дважды: в группе TargetChange и в объявлении типа. Вдобавок если потом делать match, то нельзя писать `case TargetChange.To(x)`, можно только `case (x, y)` или `case p`.

Enum-ы в расте, как и хендлинг эксепшенов, не являются принципиально новыми подходами, но являются максимально удобными в использовании и чтении, что на самом деле очень важно. Например, checked exceptions в джаве по принципу действия очень похож на хендлинг ошибок в расте, но первое универсально ненавидилось сообществом, а второе считается замечательной фичей. Синтаксис важен.

Можно примеры, пожалуйста? PyCharm не ловит ни одного нарушения пепа, и как можно оценивать нейминг не имея представления о предметной области проекта?

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность