Pythonの','.join()がキモいと思ってた時代が僕にもありました

↑を読んだ感想。


前に

'-'.join(a)    # ← 閉口
PythonでもRubyみたいに配列をメソッドチェーンでつなげたい - by edvakf in hatena

こんなふうに書いたら、Twitter やらコメント欄やらで色々なコメントをもらった。

最終的には

RubyのArray.joinが文字列専門になるのは「文字列はよく使うから特別」という発想だけど、Pythonにとっては「明確なメリットが無い限り特別を持ち込むのはキモイ」だろう。しかも、Pythonには文字列が埋め込み型だけで str, unicode, bytes, bytearray の4つ、(Python2.xではstrとbytesがエイリアスで、Py3kではstrがunicodeになってunicodeはなくなるので実質3つ)、そのうち一つだけを「特別」扱いするのはそもそも不可能だ。

','.join() がなぜキモイのか - methaneの日記

のようなことを考えて、自分の中では「別にキモくないじゃん」と納得した。(でも↑を読むと Python より Ruby のほうが「やり方が一つだけあるのがいいね」な言語に思えてしまう)


ただ納得できないのが、

「連結する側とされる側」というように分類すると、「区切り文字 join 連結される文字」が素直な能動態で、「連結される文字列 (is) join(ed by) 連結される文字」だと無理やりな受動態になるので、''.join() の方が素直だ。

','.join() がなぜキモイのか - methaneの日記

とか、前の自分の記事についたコメントの

joinが文字列のメソッドなのは英語の他動詞の使い方として正しい。

PythonでもRubyみたいに配列をメソッドチェーンでつなげたい - by edvakf in hatena

という意見。(id:methane さんの意見でないことは承知しています)

Python で (例えば) list のメソッドだけを見てみても、

l.append(x)
l.extend(L)
l.insert(i, x)
l.remove(x)
l.pop([i])
l.index(x)
l.count(x)
l.sort(f)
l.reverse()

とあり、英語の使い方で言うなら

append x to l
extend l by L
insert x into l at i
remove x from l
pop [i] from l
index of x in l
count x in l
sort l by f
reverse l

と、全部バラバラで、','.join(l) みたいに「主語→動詞→目的語」的なものはひとつもない。index に至っては動詞でもない。

これを使うときにイチイチ「英語としてキモい」なんて考えてる Python 使いがどこにいるんだと。