やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Python2.7.16バグ str.split()名前引数sepを指定するとエラーになる

 またやってくれましたよ蛇野郎。

手順

 PythonのREPLを起動する。(端末でpythonコマンド実行)

python
>>>

 以下コードを実行する。

s = 'A B CD E'
s.split(sep=' ')

 エラー……。

TypeError: split() takes no keyword arguments

期待値

s.split(sep=' ')
['A', 'B', 'CD', 'E']

 split()sep=' 'を指定しなければ成功する。

 また、Python3.7.3ならsepを指定しても成功した。

python3
s.split(sep=' ')
['A', 'B', 'CD', 'E']

対策

 でも、それではセパレータ変更できないじゃん。デフォルトのスペースなどでしかsplitできないの? と思ったが、第一引数に指定すればOK。

s = 'k1=v1'
s.split('=')
['k1', 'v1']

原因

 これはPythonのバグ。どうやらC言語で実装されたCPythonのバグらしい。でもたぶんPython側でこれをバグとは言わないのだろう。仕様というに違いない。使用者からみればバグでしかないが。

CPython実装の詳細:実装は、ドキュメントの目的で「名前付き」であっても位置キーワードが名前を持たない組み込み関数を提供する場合があり、したがってキーワードで提供することはできません。CPythonでは、これはPyArg_ParseTuple()引数を解析するために使用するCで実装された関数の場合です。

 そこを穴埋めするのが君の役目じゃないのかね、蛇くん?

 というか、名前付き引数すべてかよ。影響範囲広すぎる……。どこに罠があるかわからんぞこれ。ここまで酷いとは思わなかった。

API文書には一切書いていない……

 こいつ……。これじゃstr.split()の罠にハマるわ。書いといてくれよ。

所感

 これだからPythonは嫌いなんだ……。

 Pythonは触るたびにクソ要素にぶちあたるクソ言語クソ。こういうの調査せねばならないことが多すぎる。なんでPythonのテストせにゃならんのだ。

 でも今はもうPython2なんて使っているほうが悪いか。そうはいってもGIMPPython使うには2しかないんだもの……。

 Pythonなんてクソ言語を世に解き放っておきながらバグ放置したままサポート終了とか……もう罪だよ。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux