Java.use(better,Python)《6.5》モジュール:jarray
《こちらに移動中です》
2008年4月25日 (金)
|記事一覧|
Java.use(better, Python) # Jython 導入ガイド
------------ 序 ------------
ここで公開している記事は「キーワード検索」を利用するための便宜的なものです。詳細は、正式版(査読中)をダウンロードしてご覧ください。
【目次】関連記事
〔Python/Jython/Swing 入門〕Shall_we_Agile = Java.use(better, Python) # Swing
実際のアプリケーション開発を疑似体験できるように、問題解決に至るまでの紆余曲折を示しながら「繰り返し段階的に」技術を習得するための話題を提 供します。OOP〔Object-Oriented Programming〕を体得するには、五感を通してフィードバックが得られる論理的シミュレーションによって、現実世界を疑似体験するのが効果的で す。この連載で、Java の常識が壊れるかもしれませんが、OOP の可能性は広がります。
【注意】連載の主旨から「先に示したプログラムが後で覆される」事例が含まれます。次の展開(失敗から何を学ぶか/学ばないか)を予想しながら読み進むのも一興です。
------------ 本文 ------------
気軽に Swing〔6〕TransferHandler: DnD
Java.use(better,Swing=Jython) 〜 萬プログラマーのための Python 導入ガイド
本間りす、森こねこ〔著〕 小泉ひよ子とタマゴ倶楽部〔監修〕
■ モジュール:jarray
モジュール jarray は、Java の配列を扱うための便利な機能を提供します。
たとえば、jarray.zeros(0,'i') は、int 型の要素を扱う配列を生成しますが、Jython の世界では、これを組み込み型 list などと同様に扱えます。
class InspectorPanel(JPanel): import jarray species = jarray.zeros(0, 'i').__class__ def __init__(self, target, selection=None): self.target = target if not selection: selection = SelectionPanel ... No change ... def actionPerformed(self, e): e = self.listView.selectedValue e = getattr(self.target, e) # oops (x.x) import jarray s = (SelectionPanel, SelectionPanel_array)[ isinstance(e, self.species)] Inspector(e, s).show()
改訂したクラス InspectorPanel では、リスト項目から選択した対象が配列なら、SelectionPanel_array を組み込んだ専用のインスペクターを起動します。改訂したコンストラクターでは、引数 selection を省略すると、規定値 SelectionPanel を設定して、汎用のインスペクターを起動します。
class SelectionPanel_array(JPanel): def __init__(self, client, target): self.client = client self.target = target self.layout = BorderLayout() e = self.listView = JList( listData=range(len(self.target)), valueChanged=self.valueChanged, preferredSize=(50, 100), ) self.add(JScrollPane(e), BorderLayout.CENTER) def valueChanged(self, e): s = self.selectedValue = e.source.selectedValue s = self.target[s] self.client.valueUpdate(s)
新たなクラス SelectionPanel_array は、配列を対象とする専用のパネルを提供します。リスト項目には、配列の添字が提示されます。そのため、各要素を参照するには、添字演算子を利用して self.target[s] とします。
■ 例外:TypeError
しかし、半歩前進したインスペクターには、問題があります。リスト項目から配列の添字を選択したまま、ボタン 'inspect' を選択すると、 例外 TypeError が発生して、次のエラーメッセージが出力されます。
TypeError: getattr(): 2nd arg can't be coerced to String
これは、組み込み関数 getattr が「第2引数に文字列」を期待しているのに、互換性のない引数が渡されたことを意味します。これを回避する方法は、次回に紹介します。
《バグの正しい飼い方》TypeError が発生したら、引数に互換性があるか、確認してみることです。