翻訳✖︎プログラミングの道に進んだワケ(4)番外編 初心者クソコード晒し
番外編について
前回、初めて書いたPythonスクリプトについてちょっと話をしたところで、昔のフォルダを整理していたら、そのころの遺物が発見されました。
初心者&独学だった分、凄いコードがたくさんありましたので、せっかくだからクソコードを晒して供養していきたいと思います。
無限変数
t1 = t.replace('\t', '\n')
t2 = t1.replace('\r', '\n')
t3 = t2.replace('。', '。\n')
t4 = t3.replace('!', '!\n')
......
Pythonのミュータブルな文字列はどこにいった!?
と言わんばかりの変数地獄です。
これは文ごとに区切るために、切れ目になりそうな全ての箇所に改行記号(\n)を入れている部分ですが、なんと置換操作を加えるたびに新しい変数を準備していました。
そのため、別の文字で区切りたくなったら、t の後ろの数字が増えていきます。当然、これより後のコードはすべて一番大きな tn を使っているので、全体に渡って変更が必要になるというメンテナンス性の悪さ、与えられた文字列✖️n 以上のメモリが必要になる非効率性と、目も覆わんばかりのクソさです。
今なら関数に分けると思います。
def batch_replace(t: str, marks: list, delimiter = '\n') -> str:
t_ = t
for mark in marks:
t_ = t_.replace(mark, f'{mark}{delimiter}')
return t_
これなら区切りたい文字列が増えてもリストmarksを修正すればOKです。正規表現もありですが、それだと他の人に使ってもらいにくいかもしれず、また文の切れ目には半角記号も多いため、こちらの方が安全かと思います。
謎の辞書
もう一つ、かなりのクソコードがありました。
results = {}
count = 0
results[str(count)] = t10
count += 1
数字をキーにして、ある値を入れておくオブジェクト。それを人はリスト(配列)と呼ぶ。
輪をかけてひどいコードですね。なぜ組み込みのリストを使わない!ってなりました。
ただこれには一応、理由があるんですよ。
Pythonを学び始めた当初から、「これは自分の翻訳業務に活かせるのだろうか」という疑問は常にあり、そこで出会ったのが「辞書オブジェクト」という言葉。言語マニアならこのオブジェクトを好きになってもしょうがないですよね?辞書を使いこなしてこそ、翻訳者プログラマーだという謎の自負心を持っていました。
というわけで(?)、このころは文字列と整数と辞書型ばかり使ったコードになっています。
しかも辞書オブジェクトは、キーを作った順番は担保されないため、元の順で取り出すのも大変です(今なら OrderedDictを使いますが)。
そこで頑張った初心者コードを見てください。
with open('./results.txt', 'w', encoding='utf-8') as f:
for i in range(len(results)):
if str(i) in results:
f.write(results[str(i)])
f.write('\n')
最初からリストを使っていれば ’\n’.join(results) で一瞬ですね。本当に何故辞書を使ったのかも分からないし、そのくせこんなアクロバティックな実装をしているのもある意味凄いなーと思ってしまいました。
他にもちょっとしたことで無限ループに入りそうな while やら何やら色々ありました。
しかしそれでもやっぱり、初めて作って動かして使った物には思い入れがあり、書き直さずにとっておこうと思ったのです。