ロゴ

cocoatomo のページ

金曜日の Jython

すみませんタイトルは勢いですm(__)m

実践
参考文献
環境
インストール方法
Mac OS X

概要 — Jython とは —

Jython とは Pure Java で書かれた Python の実装のことです. この言語が面白いのは「Jython に現れるオブジェクトが皆正真正銘の Java のオブジェクトだ」ということです. なので,

ということが実現されており, Java の堅牢性と Python の柔軟性を併せ持った魅力的なハイブリッド言語なのです.

実践

論より証拠で早速触ってみましょう. Jython に対してウリウリするための道具は, Jython の対話モード, type 関数, print 文です.

「ウリウリする」とは, 俺がプログラミング言語を学び始めるときに「とりあえず動くものを作ったり, それの改良の繰り返しをしたりして, 言語についての感覚を身に付けていく」という感じのことです. 「HelloWorld のその次に進むための作業」とも呼べるかもしれません. 特に体系立てている訳ではなく思い付きの衝動に任せて進むことがほとんどです.

ではJython の対話モードに入って, 様々なオブジェクトの型を調べてみましょう.

$ jython
>>> print 'hoge'
hoge
>>> type('hoge')
<jclass org.python.core.PyString 1>

これを見ると Python の文字列型に相当する PyString 型というのが定義されていることが分かります. "org.python.core.PyString" でググってみると, こんな Javadoc が見付かります. これを足掛りにしたら色々分かりそうです.

ちょっと寄り道して, 本当に java オブジェクトとしてのメソッドを Jython から呼べるか確かめてみましょう.

>>> 'hoge'.hashCode()
Traceback (innermost last):
  File "<console>", line 1, in ?
AttributeError: 'string' object has no attribute 'hashCode'

あれ?おかしいですね, Javadoc にもちゃんと載っているメソッドが呼べないですね……? と, ここで Python では確かメソッドやプロパティなどの名前空間を辞書で管理していたことを思い出しました. てことは, それらを管理している辞書が見れるはずです. ググってみるとばっちり dir 関数という関数がありました.

>>> dir(type('hoge'))
['__add__', '__cmp__', '__complex__', '__contains__', '__len__', '__mod__', '__repr__', '__str__', 'alnum', 'alpha', 'capitalize', 'center', 'classDictInit', 'count', 'decimal', 'decode', 'digit', 'encode', 'endswith', 'expandtabs', 'find', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'islower', 'isnumeric', 'isspace', 'istitle', 'isunicode', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'numeric', 'replace', 'rfind', 'rindex', 'rjust', 'rstrip', 'space', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'unicode', 'upper', 'zfill']

メソッドもプロパティも属性という同じ種類のものとして扱うところが Python らしさなのでしょうか.

色々と便利そうなメソッドが並んでいますが, どうやら hashCode() は呼べないようですね. 残念. だとするとあの Javadoc は何だったんでしょう??

まぁ, それはとりあえず横に置いておいて, 作業を続けましょう.

>>> print 1
1
>>> type(1)
<jclass org.python.core.PyInteger 2>

むむっ, これもまたなにやら見たことがない型が用意されていますね.

名前から考えれば Jython 用の整数クラスですね. 早速 dir で調べてみましょう.

>>> dir(type(1))
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce_ex__', '__complex__', '__div__', '__divmod__', '__float__', '__floordiv__', '__hex__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rdiv__', '__rfloordiv__', '__rmod__', '__rmul__', '__rpow__', '__rshift__', '__rsub__', '__rtruediv__', '__sub__', '__tojava__', '__truediv__', '__xor__', 'getValue', 'hashCode', 'isMappingType', 'isSequenceType', 'mappingType', 'sequenceType', 'toString', 'value']

さっきの PyString 型よりもアンダースコア2つで挟まれたメソッドが多いですね. このメソッドは何かと云うと, Python 特有の仕組みで

1 + 2 # 実は (1).__add__(2) が呼ばれる.
abs(-1) # 実は (-1).__abs__() が呼ばれる.

というように呼ばれるメソッド達なのです.

因みに, 1 に括弧が付いているのは

(1.)__add__(2)

と解釈されないためのものです.

このように言語を設計してあるおかげで, 言語の色々なところをカスタマイズできます. 例えば,

>>> class Hoge:
... 	def __init__(self, value):
... 		self._value = value
... 	def __add__(self, other):
... 		return other + self._value
...
>>> hoge = Hoge('fuga')
>>> hoge + 'hemo'
'hemofuga'

というような変態的な動作をするクラスも作れてしまいます. (まぁ, 実際にはこんなクラスを作ったら混乱するので作りませんが.) → 参考: クラスの作り方

参考文献

環境

インストール方法

Mac OS X

MacPorts を入れて

$ sudo port install jython

以上で終了です. かなり簡単ですね.

注意. 初回起動時には

$ sudo jython

としないと jython に必要な jar を作ってくれません.