LINUX.ORG.RU

История изменений

Исправление Anatolik, (текущая версия) :

В Ruby Array это именно массив строк?

В Ruby Array — это массив элементов, которые могут быть преобразованы в строку. Соответственно, еще до рантайма, для любого массива #join без аргументов и с корректным аргументом гарантирует, что возвращена будет строка.

Но можно гарантировать хотя бы в рантайме. И питон это делает, как видишь из своего же примера.

Что именно гарантирует питон?

Контейнер это всего лишь набор объектов, он не может поддерживать операцию join(), т.к. гетерогенен и ему пофиг на тип включаемых в себя объектов, он о них ничего не знает.

С моей точки зрения, это один из главных недостатков питона.

Конкатенация это только свойство строк.

А это что? Конкатенация — это не только свойство строк.

В Py эту ситуацию обработали достаточно корректно, операция join() берёт на вход итератор за которым может быть не только массив и не только контейнер.

В документации указана следующая сигнатура — str.join(iterable). Дано определение iterable.

Мне обещают, что если я передам этому методу iterable, то все будет в порядке. И когда я передаю ему [1,2,3], валидный iterable, я начинаю чувствовать себя несколько обманутым.

Конечно, я понимаю, что там есть эта приписочка — «A TypeError will be raised if there are any non-string values in iterable, including bytes objects.». Но эта приписочка, почему, черт возьми, она никак не отражена в сигнатуре? Для меня это является показателем того, что система типов в этом языке продумана недостаточно хорошо. В Ruby меня так никогда не обманывали.

Исходная версия Anatolik, :

В Ruby Array это именно массив строк?

В Ruby Array — это массив элементов, которые могут быть преобразованы в строку. Соответственно, еще до рантайма, для любого массива #join без аргументов и с корректным аргументом гарантируется, что возвращена будет строка.

Но можно гарантировать хотя бы в рантайме. И питон это делает, как видишь из своего же примера.

Что именно гарантирует питон?

Контейнер это всего лишь набор объектов, он не может поддерживать операцию join(), т.к. гетерогенен и ему пофиг на тип включаемых в себя объектов, он о них ничего не знает.

С моей точки зрения, это один из главных недостатков питона.

Конкатенация это только свойство строк.

А это что? Конкатенация — это не только свойство строк.

В Py эту ситуацию обработали достаточно корректно, операция join() берёт на вход итератор за которым может быть не только массив и не только контейнер.

В документации указана следующая сигнатура — str.join(iterable). Дано определение iterable.

Мне обещают, что если я передам этому методу iterable, то все будет в порядке. И когда я передаю ему [1,2,3], валидный iterable, я начинаю чувствовать себя несколько обманутым.

Конечно, я понимаю, что там есть эта приписочка — «A TypeError will be raised if there are any non-string values in iterable, including bytes objects.». Но эта приписочка, почему, черт возьми, она никак не отражена в сигнатуре? Для меня это является показателем того, что система типов в этом языке продумана недостаточно хорошо. В Ruby меня так никогда не обманывали.