意味悲鳴

PythonとかUnityとか.技術ブログでしたが,研究ブログにシフトしました.

Pythonのlicenseが使えそうで使えない話

前置き長いので先に結論だけ。

  • Pythonにはライセンスをlessみたいに表示するlicense()がある
  • license自体はNoneTypeだけど、license()を一度実行するとlicense._Printer__linesにPythonのライセンスが一行ずつ格納されたリストができる(っぽい?)
  • 使う気になればデバッグしたり遊んだりできそうだけど、使えるようで使えない気がする。



相変わらずPTVSでPythonやっております。Dive into the Python3のおかげで、Rubyはじめた時よりも言語の深淵に触れられている気がしてとても楽しいです。使いこなせるようになるまで頑張りたいなぁ。

で今日、私がlistをlictと打ち間違えそうになった時にIntelliSense先生がlicense()とかなんとかいう関数を引っ張りだして来てくれてですね。試しに実行してみたんです。

>>> license()
A. HISTORY OF THE SOFTWARE
==========================

Python was created in the early 1990s by Guido van Rossum at Stichting
Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
as a successor of a language called ABC.  Guido remains Python's
principal author, although it includes many contributions from others.

In 1995, Guido continued his work on Python at the Corporation for
National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
in Reston, Virginia where he released several versions of the
software.

(中略)

(1) GPL-compatible doesn't mean that we're distributing Python under
    the GPL.  All Python licenses, unlike the GPL, let you distribute
Hit Return for more, or q (and Return) to quit:

こんな感じ。こんなのあるなんて初めて知った。

ここの内容が読めるようになってるみたい。
History and License — Python 3.4.3 documentation


で、これだけ大量の英文があるってことは、なんかのデバッグにも使えるんじゃね?とか考えて色々試してみることに。ただ、Python初めて2週間も経ってないので、マジで良くわかってないことをご了承ください。

>>>list(license())
A. HISTORY OF THE SOFTWARE
==========================

(中略)

Hit Return for more, or q (and Return) to quit: q
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

ようするに、None、Cで言うところのNull(?)と同じ扱いになっているらしい。他にもtupleとかsetとかやってみたけど、どれも先にライセンスが表示(多分license()が実行)されちゃって、その後同じTypeErrorが返ってきてダメだった。Typeで試してもやっぱりNoneTypeらしい。


今更気づいたんだけど、docstring読んでみる。

>>> license.__doc__
'interactive prompt objects for printing the license text, a list of\n    contributors and the copyright notice.'

お、なんか出てきた。Google翻訳先生にやっていただくと、

ライセンステキスト、貢献者のリストと著作権表示を印刷するための対話プロンプトオブジェクト。

なるほど、まんま日本語で理解できる。分かりやすい。ってそうじゃねーよ。よくよく考えたらこれってlicenseってオブジェクトなわけですから、いろんな変数あるはずなんですよね。で一つ一つ出力したりtypeで調べてみたりしたら。

>>> type(license._Printer__lines)
<class 'list'>

あれ?リストの変数あるじゃん。でインタラクティブシェルをリセットして見てみると。

Resetting execution engine
The Python REPL process has exited

>>> type(license._Printer__lines)
<class 'NoneType'>

>>> license()

(ライセンスが出力)

>>> type(license._Printer__lines)
<class 'list'>

つまり、一度license()を呼んだ時に、キャッシュするためにlicense._Printer__linesにライセンスのデータが格納されているみたい。じゃあ一回license()を呼べばいいじゃんってなるんだけど、お察しの通り対話的になっているので、要するに一回license()を閉じないといけないわけで、使い道限られそうだなぁと思います。

まぁPython歴2週間の私がこんなこと考えても無駄でしょうし、たぶん使い道はたくさんあると思うので、Pythonistaの皆様はぜひともブコメやコメントを残していただければと思います。以上です。