やねうら王の作者さんが、Python からやねうら王を操作する Ayane というものを公開しています。

ここ数年は他にも機械学習関係で Python code が増えているので、ついに Python に手を出してみました。


ただ…私は Ruby 畑の者なので、Ruby 畑の感覚で色々やろうと思っても Python 畑は結構勝手が違うように感じました。

例えば Ruby 畑だと以下のような感じです。

  • package manager は RubyGems + Bundler が一般的。
  • 「abc」という code (program) を書き始めるなら、まずは bundle gem abc と入力して雛型を作り、必要事項を埋めていく。
  • code (program) の文書は YARD 形式で記入することが一般的。ちょくちょく yardoc と入力して文書化率が 100% 近くを保っているかどうか随時確認。
  • code (program) の整形は RuboCop に任せることが一般的。
  • 完成したら package 化しておくと (RubyGem にしておくと) 自分も他人も再利用が楽。

で、最初に Python で標準的な package manager が何なのか調べてみたのですが、どれが標準的なのかよく分かりません。一番よく見かける package manager は pip というものなのですが、雛型を生成する機能が見つかりません。

pip より新しそうな pipenv というものも見つけました。こんな記述

もう pipvirtualenv を別々に使う必要はありません。 両者は連係して動作します。

もあったので、「pip が RubyGems に、 virtualenv が Bundler に対応するのかな」と理解したのですが、それでもやっぱりこの pipenv が学習に値するのか、判断がつきませんでした。(上記の記述とその続きを読むと、まるで pipenv が決定版であるように感じる表現なのですが、自己評価・自己表現というものはかなり盛られていることが多いので、信頼できませんでした。)

さらに調べて「Pythonのパッケージングと配布の全体像」という資料を見つけました。これによると、pipenv が作られたのは2017年のようです。「Bundler が2009年頃に登場していたのに比べると、随分遅いなあ、『事実上の標準』(defact standard) 争いに決着がつくのが遅かったのかな?」と思っていたら、Python の package managers はその後も登場しているようで、未だに群雄割拠時代が続いているのかも知れません。


こういう場合、どれに手を出すと良いのでしょうね。pipenv? poetry? rye? こういうのって、事実上の標準が定まると他は廃れていくので、最初の選択が結構大切です。(Ruby 畑では RubyGem 作成用として Bundler の他にも gemcutter なんかがあったのですが、今では完全に廃れてしまいました。)

思えば、例えば QR code 決済は PayPay の独り勝ちになったので、支部役員内の決済は PayPay を採用しました。

「今から主力戦法を選択しよう」と考えている将棋初心者も似たような気持ちなのかも知れません。多数派の利点は棋書が多いことが挙げられるかと思います。(しかし、あえて少数派の戦法を選ぶという方針もあってよいと思います。)


余談。JavaScript の標準的な package manager である npm はかなりイカレていて、例えばほんの数十行の Vivliostyle 文書を書くだけで約 100MB もの保存容量を消費します (1文書毎に約 100MB なので、10文書なら約 1GB です)。なのに npm の web site には「npm is committed to making JavaScript development elegant, productive, and safe.」なんて書いてあります。いやいや、elegant とは対極でしょうに。自己評価とはあてにならないものです。

Python に手を出す前、「Python の package managers も npm みたいな頭の悪い管理方式を採用していたらどうしよう」という心配をしていました。最初に pip を試してみて、その心配が不要であることが分かり、良かったです。

JavaScript の名誉のために書いておくと、npm より新しい pnpm を使えば、npm による恐ろしいほどの disk 容量浪費を避けることができます。技術的な話はこちらが詳しいです。

…すみません、将棋とはほぼ関係ない話をダラダラと書いてしまいました。