Питонистическое.
Jan. 5th, 2020 09:37 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Выяснил что в стандартной библиотеке питона модуль collections, а в нем функция namedtuple. Позволяющая генерировать наборы данных с именованными полями и нулевым оверхедом. Более того named tuples - hashable, т.е. могут использоваться в качестве индекстов dict или элементов множества. И их очень удобно создавать из списков, dictionaries и тому подобных конструкций.
Теперь хочу реализацию операций реляционной алгебры над set of named tuples.
Теперь хочу реализацию операций реляционной алгебры над set of named tuples.
no subject
Date: 2020-01-05 07:09 pm (UTC)Down with static typing
Date: 2020-01-05 09:09 pm (UTC)А кому нужны Жаба и ЦиПлюкПлюк — пусть идут в Жабу и т.д.
Re: Down with static typing
Date: 2020-01-05 10:54 pm (UTC)Re: Down with static typing
Date: 2020-01-06 12:08 am (UTC)В тех проектах, где я видел использование mypy — отсутствие type hints выдавало ошибку. Не знаю, можно ли это отключить. Я вместо этого предпочитаю просто не иметь дела с mypy.
Как написать type hint "в этом месте мне нужен экземпляр класса, имеющий метод
.read()
без параметров, возвращающий строку"?Re: Down with static typing
Date: 2020-01-06 06:25 am (UTC)В общем виде это называется «протокол»:
В частном случае вообще может подойти
typing.TextIO
.И да, я применяю mypy в боевом проекте. Польза от наличия аннотаций типов как документации для читателя/мейнтейнера кода настаёт при размере проекта больше 150 SLOC. А польза от mypy — примерно с той точки, когда проект естественным образом разделяется на несколько файлов.
Re: Down with static typing
Date: 2020-01-06 01:56 pm (UTC)Re: Down with static typing
Date: 2020-01-06 10:36 am (UTC)https://mypy.readthedocs.io/en/latest/protocols.html#protocol-types
Только не забывайте, что mypy -- это не статическая типизация, а проверка type hints там, где программист счёл их нужными. Если не написать type hints, ничего не будет -- например, если убрать "-> int" в описании класса Bad, ошибка исчезнет.
> В тех проектах, где я видел использование mypy — отсутствие type hints выдавало ошибку.
Я так понимаю, что Вы не видели использование mypy.
Re: Down with static typing
Date: 2020-01-06 01:58 pm (UTC)Я видел использование mypy в нескольких крупных проектах и сильно его там невзлюбил. :-( Отсутствие type hints там везеде приводило к ошибкам.
Re: Down with static typing
Date: 2020-01-07 07:27 am (UTC)Выдавать ошибки на отсутствие аннотаций — это опция. И даже выключенная по умолчанию. Включить её принимает решение мейнтейнер проекта, в тот момент, когда проект уже достаточно аннотирован, или одновременно с решением аннотировать его весь.
В отдельных редких местах, где действительно применяется duck typing и кажется нецелесообразным прямо сейчас прописывать весь протокол, — ошибку можно заткнуть указанием аннотации
Any
(а лучше — отдельным типом, определённым как синонимAny
, с TODO’шкой когда-нибудь это расписать).Re: Down with static typing
Date: 2020-01-07 08:20 am (UTC)src/backend/storage/smgr/md.c из постгреса, в котором Настя Лубенникова нашла комментарий вида FIXME, написанный до её рождения. и так и оставшийся на этом месте.
no subject
Date: 2020-01-05 08:03 pm (UTC)no subject
Date: 2020-01-05 09:10 pm (UTC)no subject
Date: 2020-01-06 07:04 am (UTC)Работать с данными все равно имеет смысл начиная с 1НФ, а вот там как разу уже дубликатов не будет.
Опять же, пересечение, объединение и симметрическая разность - очень полезные операции.
no subject
Date: 2020-01-06 08:16 am (UTC)Дубликаты в данных легко и непринуждённо образуются в результате неаккуратной реализации проекции.
Допущение «set of named tuples», впрочем, эту проблему снимает. Если, конечно, нас устраивает иммутабельность объектов.
no subject
Date: 2020-01-06 08:26 am (UTC)И в случае если данные у нас живут в памяти командно-строчного скрипта, ограничение на иммутабельность, как правило, не мешает. При старте прочитали с диска, обработали, построили рядом со старой новую копию, сохранили. (впрочем, в моем случае модифицировать придется не данные, а те объекты, о которых они. А метаинформацию в пригодном для чтении виде мне сгенерят внешние инструменты).
no subject
Date: 2020-01-06 09:08 am (UTC)no subject
Date: 2020-01-06 09:20 am (UTC)no subject
Date: 2020-01-06 11:12 am (UTC)no subject
Date: 2020-01-06 11:56 am (UTC)Данные размером меньше мегабайта обрабатывать во "взросллой СУБД", одностраничные служебные записки писать в полнофункциональном офисном пакете и так далее.
no subject
Date: 2020-01-06 05:27 pm (UTC)no subject
Date: 2020-01-06 12:03 pm (UTC)no subject
Date: 2020-01-06 12:29 pm (UTC)no subject
Date: 2020-01-06 01:12 pm (UTC)Вот я сейчас бегло пробежался по источникам, и там наоборот, говорят:
а также
no subject
Date: 2020-01-06 05:31 pm (UTC)no subject
Date: 2020-01-06 07:56 pm (UTC)Это странное заблуждение, к тому же уникальность элементов набора -- это свойство области предметной области, а не области схемы БД.
no subject
Date: 2020-01-05 08:13 pm (UTC)Или хочется свой бэкенд?
no subject
Date: 2020-01-05 09:11 pm (UTC)no subject
Date: 2020-01-06 07:14 am (UTC)Почему-то YUM кладет в каталог метаинформации файл .sqlite.gz. И вот как начать работать с ней, не распаковывая во временный файл на диске, я не придумал.
Поэтому парсю в xml.etree лежащий рядом xml.gz c той же информацией.
Благо вот его можно распактвывать сразу на вход парсера.
Но это - местами. Потому что рядом лежат дебиановские репозитории, где метаинформация лежит в виде yaml-подобного файла Packages и дублирующих его баз данных reprepro, и альтовские, где вообще хрен поймешь что там внутри ихних бинарных файлов. И то и другое приходится читать вызовом внешних процессов.
no subject
Date: 2020-01-06 07:10 am (UTC)А использование ORM-ов над SQL-ем это вообще по-моему идиотизм.
Объекты - это очень слабая (потому как слишком универсальная) абстракция. Сама по себе реляционная модель - абстракция куда более мощная.
Хотя, конеяно, при таких объемах данных, как те, что я на питоне обрабатываю. можно и конструктор объекта на кажыдй кортеж звать - не жалко. Оверхед пренебрежимо малый получится. Там и сотни тысяч объектов не наберется. Но вот объекты hashable придется делать вручную. А named tuples они такие даром получаются.
В основном, конечно вопрос там в наиболее сладком синтаксическом сахаре. Как сделать код наиболее понятным для читателя.
no subject
Date: 2020-01-06 09:52 am (UTC)no subject
Date: 2020-01-06 12:01 pm (UTC)Но вообще если у тебя до уровня CRUD доехали объекты, то у тебя имеется какое-той fundamental design flaw. Вроде изначальной идеи php, где смешивается presentation и processing.
В стандартной model-view-controller парадишгме объекты должны оставаться на уровне view и в модель уже не лезть.
no subject
Date: 2020-01-06 12:31 pm (UTC)no subject
Date: 2020-01-06 05:37 pm (UTC)no subject
Date: 2020-01-06 08:19 pm (UTC)no subject
Date: 2020-01-07 01:25 pm (UTC)PS: Собственно в GCC 2.xx было подобное опытное расширение - сигнатуры, но не прижилось.
no subject
Date: 2020-01-07 03:25 pm (UTC)no subject
Date: 2020-01-07 01:31 pm (UTC)Элементы - ну обычные довольно по функциональщие записи с именованными полями и "алгебраические" типы (union-ы с именованными вариантами) ну и естественно любые элементы сами по себе могут быть коллекциями и проч.
Все хитрые "запросы" тривиально пишутся в хаскелльного стиля сверточном синтаксисе.
При этом у модели есть прямая проектция в sql, хотя автор развивал и свою: поскольку информации о том "что надо" тут гораздо больше можно этим попытаться воспользоваться для оптимизации.
На деле оказалось просто мало кому интересно - все рисуют на sql и довольны как питоны :)