batteries included, сказал питон
[[1,2], [3,4]].flatten()
^ ERROR: Flatten is not a battery. That's why it's not in the Python.
[[1,2], [3,4]].flatten()
^ ERROR: Flatten is not a battery. That's why it's not in the Python.
no subject
FP not available. As Guido said, he does not know categories, and has no plans to learn.
no subject
Даже в ансибле есть |flatten. Это не категория, это просто функция, в категории (?) batteries included.
no subject
ну или в лоб:
no subject
no subject
Материализация всех промежуточных списков.
no subject
Вот, кстати, я сейчас подумал про семантику flatten для питона... В силу мягкой типизации, я ожидаю, что вот это тоже будет flatten:
[1, [1,2], [3, [4, [5]]]], в [1,2,3,4,5]
Я не уверен в soundness такого для Rust'а, но |flatten в jinja делает именно это. "Я хочу линейный список".
no subject
Наличие двух различных семантик для одного имени метода — веская причина метод с таким названием не делать частью стандартной библиотеки.
Для строго типизированных языков придётся определить рекурсивный тип
Tree[T]
какT | List[Tree[T]]
и сказать, что функцияtop
имеет типTree[T] → List[T]
. (А альтернативная семантика — это простоconcat
или монадныйjoin
.)no subject
Если flatten многозначен, то flatten_once и flatten_recursively снял бы все вопросы. Или даже .flatten(recursive=True).
Тут ещё одна проблема, что в питоне полный раздрай между методами (str.strip()), магическими методами для функций из прелюдии (len(str)) и "инверсными" методами вроде ",".join(str).
Чем больше я таких странностей в питоне вижу, тем мне грустнее с ним работать.
no subject
Не, к дизайну API стандартной библиотеки у меня больших вопросов нет. Магические методы для поддержки перегрузки операторов всё равно нужны. Ну, может быть, они бы смотрелись красивее, если бы назывались не dunder-именами, а
operator **
, как в C++, но вот как раз метод, имя которого не является валидным идентификатором, магичнее dunder’а. Джойн нескольких строк в строку через разделитель-строку выглядит чужеродно как метод класса списка — потому что лишь малая часть всех списков является списком строк. И ещё джойнить же хочется не только списки, но любые итерабли.Вот то, что
issubclass(bool, int)
и!issubclass(int, float)
— это печалька.no subject
У меня не вызывают вопросы len, eq и т.д.
У меня вызывают вопрос len (почему len(str), а не str.len()), собственно, repr/str() (должны быть .repr() и .str()), а так же ' '.join([str]).
Насчёт float'а, считать его подмножеством int'а - ошибка.
1e63+1 == 1e63
no subject
Это и есть признак питоновых batteries included. Нет? Напиши сам.