独学コンピューターサイエンティスト監訳者の清水川貴之さんが隠し続けているバグについて
最初に書きます。
Python言語のクラスを print関数で出力しようとして、そのクラスの __str__メソッドが処理出来ずに落ちる場合。サンプルプログラムであれ何であれ、それは明確なバグです。__str__メソッドが、クラスで使用している特定のデータを処理出来ずに落ちるのであれば、そのバグがある独自の __str__メソッドはデバッグするか、そのクラスのメンバーから削除するべきです。__str__メソッドは、その特性上、そのクラスで扱われる全てのデータに対応していなければなりません。クラスで使用する、ある一部のデータのみにしか対応していない __str__メソッドは意味を持ちません。そのような __str__メソッドを決して実装するべきではありません。
それでは、事の始まりを書きます。
まず、日経BP発行の『独学コンピューターサイエンティスト』 第2部 第10章にあるサンプルプログラムにバグを見つけたのが始まりです。具体的には p179 で、Pythonのサンプルプログラムに追加された LinkedListクラスの __str__メソッドが、p181 で同じ LinkedListクラスの appendメソッドを使い追加したランダムな整数データを出力しようとすると、落ちるバグを見つけました。このバグのより具体的な内容は
https://note.com/0_humpty_dumpty/n/n0f99b6b9f115
に記述しています。
確認の為に記述すると、p179 で追加された __str__メソッドは、それに続く P180 から P181 のサンプルプログラムの一部として書かれています。その根拠は p179 に掲載されている __str__メソッドのソースコードの左端にある行番号です。19行から25行に渡り __str__メソッドのソースコードが書かれており、それに続く p180 で追加されている searchメソッドのソースコードの行番号は 27行から始まり 34行で終わっていて、明らかに一つのサンプルプログラムとして繋がっています。実際、日経BOOKプラスの独学コンピューターサイエンティストのページ https://bookplus.nikkei.com/atcl/catalog/22/07/19/00285/ よりダウンロード出来るサンプルプログラムに含まれる p180-p181.py では次のように一つのサンプルプログラムに収まっています。
class Node:
def __init__(self, data, next = None):
self.data = data
self.next = next
class LinkedList:
def __init__(self):
self.head = None
def append(self, data):
if not self.head:
self.head = Node(data)
return
current = self.head
while current.next:
current = current.next
current.next = Node(data)
def __str__ (self):
data_list = []
node = self.head
while node is not None:
data_list.append(node.data)
node = node.next
return "\n".join(data_list)
def search(self, target):
current = self.head
while current:
if current.data == target:
return True
else:
current = current.next
return False
import random
a_list = LinkedList()
for i in range(0, 20):
j = random.randint(1, 30)
a_list.append(j)
print(j, end=" ")
print(a_list.search(10))
にも関わらず、この P180 から P181 のサンプルプログラム p180-p181.py の最後に一行 'print(a_list)' を追加すると独自の __str__メソッドが落ちます。
この P180 から P181 のサンプルプログラム p180-p181.py は、p176 から p177 に掲載されているサンプルプログラム Nodeクラス、__init__メソッド、appendメソッドを、1行から17行に渡りそのまま同じ行番号で取り込んでいます。取り込まれた appendメソッドは p180-p181.py の42行目でコールもされています。p176 から p177 に掲載されているサンプルプログラムが p180-p181.py 内で有効であるなら、p179 で掲載されてそのまま同じ行番号で取り込まれている __str__メソッドも確実に有効です。
それでは、要点をまとめます。
str メソッドは、オブジェクトの「非公式の (informal)」あるいは表示に適した文字列表現を計算するために、 str(object) と組み込み関数 format(), print() によって呼ばれます。戻り値は stringオブジェクトでなければなりません。
p180-p181.py の LinkedListクラスの __str__メソッドは、同一ソースファイルの同じ LinkedListクラスの appendメソッドを使い追加される整数データに未対応で、print関数で出力しようとすると TypeError で落ちます。
================================================
ここからが本題です!
2023-04-02 にツイッター上で、次のように清水川貴之さんに、このバグを報告しました。
しかし、今ままでバグ等を報告していた場合と異なり、いいねさえ付かず一切のリアクションがありません。
一週間以上様子を見ましたがリアクションがないので、重ねて 2023-04-11 に、清水川貴之さんの普段のツイッターのツイートに次のようにリプをしました。
それでもまた、2日以上一切のリアクションがありません。
清水川貴之さんがこのような態度をとる理由が分かりません。それで、自分が清水川貴之さんの立場なら、どのような理由でこのような態度をとるだろうかを考えてみました。
そう仮定して考えて見ると、まず思い付くのは、今の社会的地位の低下を防ぐ目的でのバグの隠蔽です。Pythonの権威としての地位を守りたいがゆえの隠蔽です。Pythonの権威として、このような初歩的で、且つ致命的なバグを見過ごした事実は受け入れられない。自分が清水川貴之さんの立場なら、そう考えるかもしれません。あくまでも、自分ならですが・・・
話を戻します。この2日以上一切のリアクションがない時点で自分はもう無駄だと思い、清水川貴之さんのツイッターフォローを外しました。自分のツイッターは、フォロー外アカウントの一切のリアクション通知をオフにしているので、この先、仮に清水川貴之さんから何らかのリアクションがあっても気付けなくなりますが、ここまで待てば十分でしょう。
実は、2023-04-11 には、発行元の日経BPにも直接このバグを報告しました。
そして、2023-04-12 に次のような回答を貰いました。
これで、日経BPより監訳者の清水川貴之さんに連絡が行く事が確認できました。しかしこれから数日待っても、このバグに対する回答が日経BPより来ません。そこで、このバグ報告に対する経過状況を 2023-04-17 に日経BPに問い合わせてみました。これは、その経過の問い合わせに対する 2023-04-18 10:30 の回答です。
この回答を見て、あと数日待ってもバグに対する回答がなければ、再び日経BPに経過を問い合わせてみよう思っていた所、予想外に同日の内 2023-04-18 15:56 に、このバグに対する次のような回答をもらいました。
これで、バグがあることの確認が出来ました。しかし話はまだ終わっていません。この致命的なバグは、未だ(2023-05-14現在)公にはされていないのです。
以下は、日経BP日経BOOKプラスの独学コンピューターサイエンティストのページ https://bookplus.nikkei.com/atcl/catalog/22/07/19/00285/ よりダウンロード出来る、訂正・補足情報についての pdfファイルの内容です。
見ての通り、自分が以前に清水川貴之さんへ報告した幾つかの不具合は掲載されていますが、今回のバグは掲載されていません。
今回のバグを公にしない事は、独学コンピューターサイエンティストを手にして読んでいる多くの人々の不利益になります。そして、これから独学コンピューターサイエンティストを手にする多くの人々の不利益になります。これらの人々を始めとする公共の不利益になります。
どのような理由で今回のバグを公にしないのかは分かりませんが、公共の利益になるように、ぜひとも公表してもらいたいものです。公表される事を願っています。
#日経BP
#独学コンピューターサイエンティスト #レビュー
#独CS #selftaughtcoder
#清水川貴之
#CoryAlthoff
#Python #Python3
#バグ #bug