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をメンテしていくとそれなりに需要あるのかもと思います.