mong - Dockerのコンテナ名をランダム生成するコードをPythonに移植してみた -の続きです.
TL;DR
- namesgenerator というパッケージが見つかりました.mongは見事に車輪の再発明でした.
- 一方
namesgenerator
は2017年12月からアップデートされていないので辞書が古く,生成できるパターンが本家やmong
より少ないです. -
mong
でインスタンス生成が必須なのは使いにくかったのでnamesgenerator
を見習ってmong.get_random_name()
を追加してみました
namesgenerator
Google, pypiで検索していて Dockerの名前生成ツールのPython版はないなぁと思っていました.しかしGitHubのコード検索をしてみたら,一瞬で下記が見つかりました.GitHubすごい.
上記のレポジトリにはPython版のほか,JavaScript/TypeScript版も含まれています.
pypiにも登録してあったので,インストールも一瞬です.
pypiの統計を見ると,月間1,000ダウンロードあるので,それなりに需要もあるようです.
もう,これを使えばいいじゃん,と思ったのですが,反省も兼ねてコードリーディングしてみました
namesgenerator と mong の違い
大きく下記の4点が違います
- 辞書の持ち方
- 関数 or クラス
-
boring_wozniak
のときの再生成の方法 -
get_random_name
の引数
辞書の持ち方
mong
は辞書を別ファイルにしているのに対して, namesgenerator
はpythonコード中にべた書きしています.べた書きすると,データ読み込み処理が不要で楽なのですが,メンテがつらそうです.
namesgenerator
は2年前に更新がとまっているので,それから本家に追加された語もあるかと思い,辞書のエントリ数で比べてみました:
-
namesgenerator
の辞書は形容詞が93語で人名が160語 -
mong
の辞書(現在のmobyと同じはず)は形容詞が108語, 人名が235語
mong
の方が形容詞で15語,人名で75語多いです.追加された語を調べる際に,べた書き方式だとGoのコードとPythonのコードを比較する必要があります.単純なdiffはできません.
一方でmong
ではmong/create_dict.py
を実行してGoコードからJSON形式の辞書を抜き出します.1行1単語にしてあるので,diffで差分が確認できます.もっとも,Goコードのフォーマットが大きく変わると辞書を抜き出すコードの修正が必要になるわけですが,mobyはそれなりに枯れているっぽいので大丈夫だと思います(思いたい).
以上から,メンテはmong
の方が楽かもしれません.
関数 or クラス
namesgenerator
は名前生成を関数get_random_name
で提供していて,mong
はNameGenerator
クラスのget_random_name
で提供しています.クラスだといったんインスタンスを生成しないといけないので面倒です.mong
を作り始めたときに,辞書を変更可能に,とか乱数シードの管理を別にできた方がよいのでは,などと考えてクラスにしましたが,一晩頭を冷やしてみるとそんなことはありませんでした.namesgenerator
の方式が良いです.
boring_wozniak
のときの再生成の方法
namesgenerator
はwhile
ループで生成ロジックを回している一方でmong
はget_random_name
メソッドを再帰呼び出しています.boring_wozniak
が生成される確率は1/25,380なので,どちらでもいいかなと思います.
get_random_name
の引数
namesgenerator
はretry
関係のロジックがありません.ここ2年で追加されたのでしょうか.また,その代わりに形容詞と名詞をつなぐsep
を変更できます.これも仕様変更でしょうか?
mongへの反映と今後の方針
いやー,見事に車輪の再発明をしてしまいました.
ただ,namesgenerator
の実装と比較することで良い点,悪い点の答え合わせができましたので,経験値が溜まってよかったかなと思います.また,良いところは見習おう,ということで関数方式を取り入れてmong.get_random_name
を追加しました.
つまり,今は下記のように書けるようになりました.
import mong
mong.get_random_name() # 'trusting_engelbart'
mong.get_random_name() # 'thirsty_brahmagupta'
今後ですが,namesgenerator
はメンテされていないので,mong
をメンテしていくとそれなりに需要あるのかもと思います.