2009-04-03 2 views
5

Mi chiedo se sia possibile non avere jython automagicaly trasformare oggetti java in tipi python quando li si inserisce in un ArrayList Java.Conservazione del tipo Java di un oggetto quando lo si passa da Java a Jython

Esempio copiato da un Jython-console:

>>> b = java.lang.Boolean("True"); 
>>> type(b) 
<type 'javainstance'> 
>>> isinstance(b, java.lang.Boolean); 
1 

Finora, tutto va bene, ma se metto l'oggetto in un ArrayList

>>> l = java.util.ArrayList(); 
>>> l.add(b) 
1 
>>> type(l.get(0)) 
<type 'int'> 

l'oggetto si trasforma in un pitone simile booleano (cioè un int) e ...

>>> isinstance(l.get(0), java.lang.Boolean) 
0 

che significa che non riesco più a vedere che questa era una volta aj ava.lang.Boolean.

Chiarimento

Credo che quello che veramente vuole raggiungere è quello di sbarazzarsi della conversione implicita da Java-tipi di Python-tipi nel passaggio degli oggetti da Java a Python. Darò un altro esempio di chiarimento. Modulo

un pitone:

import java 

import IPythonModule 

class PythonModule(IPythonModule): 

    def method(self, data): 
     print type(data); 

E un Java-classe che utilizza questo modulo:

import java.util.ArrayList; 

import org.python.core.PyList; 
import org.testng.annotations.*; 

import static org.testng.AssertJUnit.*; 

public class Test1 { 

    IPythonModule m; 

    @BeforeClass 
    public void setUp() { 
     JythonFactory jf = JythonFactory.getInstance(); 
     m = (IPythonModule) jf.getJythonObject(
       "IPythonModule", 
     "/Users/sg/workspace/JythonTests/src/PythonModule.py"); 
    } 

    @Test 
    public void testFirst() { 
     m.method(new Boolean("true")); 
    } 
} 

Qui mi vedrà l'uscita di 'bool' a causa della conversione implicita, ma quello che ho mi piacerebbe davvero vedere 'javainstance' o 'java.lang.Boolean'. Se vuoi eseguire questo codice avrai anche bisogno della classe JythonFactory che può essere trovata here.

risposta

1

Sembra che tu stia utilizzando una vecchia versione di Jython. Nelle attuali versioni di Jython, il tipo Python bool corrisponde a Java Boolean.

Jython non sta trasformando il tipo Java in un tipo Python sulla strada nello ArrayList - al contrario, trasformerà un tipo Python primitivo in un tipo Java primitivo o wrapper quando lo passerà a un metodo Java e un Tipo Java a un tipo Python in uscita.

È possibile osservare questo stampando il contenuto dell'array. Si noti che Python bool è in maiuscolo (True); Java Boolean non lo è.

>>> from java.lang import Boolean 
>>> b = Boolean('True') 
>>> b  
true 
>>> from java.util import ArrayList 
>>> l = ArrayList() 
>>> l.add(b) 
True 
>>> l 
[true] 
>>> l.add(True) 
True 
>>> l 
[true, true] 
>>> list(l) 
[True, True] 

Se questo continua a non fare quello che vuoi, non crei una funzione di supporto piccola Java che prende in esame la matrice per voi senza conversione. È probabilmente un bug che Jython non converte automaticamente il Boolean costruito in Python bool, e in questo caso non offre alcun vantaggio sull'uso di Boolean.TRUE o di Python True.

+0

Sì, sto utilizzando l'ultima versione stabile, 2.2.1 che non supporta il tipo bool Python ... Download 2.5b adesso ... –

+0

>>> b = java.lang.Boolean ("true "); >>> l = java.util.ArrayList(); >>> l.add (b) True >>> tipo (l.ottenere (0)) >>> isinstance (l.get (0), java.lang.Boolean) Falso Per quanto posso vedere, la conversione avviene ancora, ed è questa conversione che don non voglio –

+0

Ci sono in realtà 2 potenziali conversioni che si verificano qui, uno che entra nell'array e uno che esce. Quando si trova in ArrayList, hai un java.lang.Boolean, che puoi vedere perché stampa con una 't' minuscola. –