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の皆様はぜひともブコメやコメントを残していただければと思います。以上です。