2009-08-12 5 views
1

J'écris une application jython avec eclipse SWT/JFace. Je dois passer float array à l'objet java pour en récupérer des valeurs. J'utilise le paquet jarray pour cela. Y at-il plus de façon pythonique de le faire?Jython (pass float array à java) y at-il une manière plus pythonique?

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]))) 

Répondre

4

Peut-être. Tout d'abord, vous pouvez réduire un peu le code:

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

Cela évite les lancers répétés. Ma prochaine étape serait de créer une méthode d'aide pour transformer le tableau en Rectangle, de sorte que vous ne devez pas répéter ce code:

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

Cela vous laisse avec:

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

Alternativement, créer une fonction d'assistance qui accepte directement le chemin.

Ou vous pourriez patch singe Chemin:

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() 

Notez que cela pourrait être un peu mal. Si cela ne fonctionne pas, regardez classmethod() et new.instancemethod() pour savoir comment ajouter une méthode à une classe à la volée.

4

L'utilisation de la liste compréhensions est considérée comme plus pythonique ces jours-ci:

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

Cela vous donnera une liste des ints arrondies. Bien sûr, vous pouvez assigner à des bornes au lieu d'utiliser « arrondi »

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

Et sur notre liste de diffusion Charlie Groves a souligné que la chose peut être explosé avec l'opérateur * comme ceci:

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

Cette * (« exploser opérateur ») est quelque chose de très utile, merci! –

2

Il est également intéressant de souligner qu'il n'est pas nécessaire d'utiliser des zéros pour créer un tableau. Vous pouvez simplement appeler getBounds avec un Python itérable contenant les instances qui peuvent être convertis en type approprié:

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

Eh bien le problème est que la méthode void getBounds (float [] bounds) (méthode native java de la classe org.eclipse.swt.graphics.Path) attend des tableaux de nombres flottants, les valeurs de retour sont écrites dans ce tableau ... –

+0

Ahh oui Si vous ne renvoyez pas la valeur, vous êtes bloqué avec des zéros. –

Questions connexes