2009-08-12 7 views
1

私はEclipseのSWT/JFaceでjythonアプリケーションを作成しています。私はそれからいくつかの値を取得するには、Javaオブジェクトにフロート配列を渡す必要があります。私はそれのためにjarrayパッケージを使用しています。それを行うためのよりpythonic方法はありますか?Jython(javaに渡すfloat配列)はもっとpythonicな方法ですか?

bounds = zeros(4, 'f') 
# from java org.eclipse.swt.graphics.Path.getBounds(float[] bounds) 
path.getBounds(bounds) 
# from java org.eclipse.swt.graphics.Rectangle(int x, int y, int width,int height) 
rect = Rectangle(int(round(bounds[0])), 
        int(round(bounds[1])), 
        int(round(bounds[2])), 
        int(round(bounds[3]))) 

答えて

4

多分。まず、コードを少し減らすことができます:

bounds = map(lambda v: int(round(v)), bounds) 

これは繰り返しキャストを回避します。私の次のステップは、あなたがこのコードを繰り返す必要はありませんので、Rectangleに配列を有効にするヘルパーメソッドを作成するには、次のようになります。

def toRectangle(bounds): 
    bounds = map(lambda v: int(round(v)), bounds) 
    return Rectangle(bounds[0], bounds[1], bounds[2], bounds[3]) 

を残すだろうと。また

rect = toRectangle(path.getBounds(zeroes(4, 'f')) 

、パスを直接受け入れるヘルパー関数を作成します。

それともでしモンキーパッチのパス:これは少し間違っているかもしれないことを

def helper(self): 
    bounds = zeros(4, 'f') 
    self.getBounds(bounds) 
    bounds = map(lambda v: int(round(v)), bounds) 
    return Rectangle(bounds[0], bounds[1], bounds[2], bounds[3]) 

org.eclipse.swt.graphics.Path.toRectangle = helper 

rect = path.toRectangle() 

注意。それでも問題が解決しない場合は、その場でメソッドをクラスに追加する方法については、classmethod()new.instancemethod()を参照してください。リストの内包表記の使用は、これらの日より多くのニシキヘビと考えられている

4

rounded = [int(round(x)) for x in bounds] 

これはあなたに丸みを帯びたint型のリストが表示されます。

rect = Rectangle(*[int(round(x)) for x in bounds]) 
+0

この*( 'explode演算子')は非常に便利なものです。ありがとうございました! –

2
:もちろん、あなたが

bounds = [int(round(x)) for x in bounds] 

を「四捨五入」の代わりに使用しての境界にそして、我々のメーリングリスト上でこれを割り当てることができチャーリー・グローブスは、全部がこのような*演算子で爆発することができることを指摘しました

配列を作成するためにゼロを使用する必要はないことも指摘しておきましょう。

path.getBounds([0, 0, 0, 0]) 
+0

よくある問題は、void getBounds(float [] bounds)メソッド(org.eclipse.swt.graphics.PathクラスのJavaのネイティブメソッド)は、浮動小数点数の配列を期待して、戻り値がこの配列に書き込まれることです... –

+0

Ahhはい、それが値を返さないなら、あなたはゼロで立ち往生しています。 –

関連する問題