Jython, używaj tylko metody z Pythona z Java?

Podczas czytania i używaniaTen artykuł zakłada, że ​​mamy pełną definicję obiektu z obiektami klasy i odwzorowania (proxy) z python do java.

Czy można zaimportować tylko metodę (niezdefiniowaną wewnątrz klasy, ale używając wewnętrznej klasy Pythona) z fragmentu kodu w Pythonie bez zawijania jej w definicji klasy (bez użycia fabrycznego paradygmatu opisanego powyżej).

Chciałbym zrobić coś w tym rodzajufrom myPyFile import myMethod z java, a następnie użyj myMethod, bezpośrednio z Java (może jako metoda statyczna?)? Ale jeśli jest to możliwe, nie znalazłem żadnej wskazówki, jak to zrobić (elementy interfejsu opisane w tym artykule mogą być nadal potrzebne, aby powiedzieć Java, jak używać myMethod?)

Z poważaniem.

EDYTOWAĆ : Zajmuję się terazJython 2.5.2, więc może to być zależne od wersji i znacznie łatwiejsze w przyszłości?

EDYTOWAĆ : Poniżej w odpowiedzi na Daniela:

Oto przykładowy kod, aby odtworzyć otrzymany błąd, a także uzyskać roboczy przykład z Twojej przydatnej odpowiedzi!

(Cóż i dodaj trochę innego pytania na temat odwzorowania z powrotem na obiekty Java z awydajność -ed wynik Pythona / Jythona)

(@Joonas, Przepraszam, zmodyfikowałem mój kod, a teraz nie mogę cofnąć się do błędu, który kiedyś miałem)

<code>import org.python.core.Py;
import org.python.core.PyList;
import org.python.core.PyTuple;
import org.python.core.PyObject;
import org.python.core.PyString;
import org.python.core.PySystemState;
import org.python.util.PythonInterpreter;

interface MyInterface {
    public PyList getSomething(String content, String glue, boolean bool);
}
class MyFactory {

    @SuppressWarnings("static-access")
    public MyFactory() {
        String cmd = "from mymodule import MyClass";
        PythonInterpreter interpreter = new PythonInterpreter(null, new PySystemState());

        PySystemState sys = Py.getSystemState();
        sys.path.append(new PyString("C:/jython2.5.2/Lib"));

        interpreter.exec(cmd);
        jyObjClass = interpreter.get("MyClass");
    }

    public MyInterface createMe() {
        PyObject myObj = jyObjClass.__call__();
        return (MyInterface)myObj.__tojava__(MyInterface.class);
    }

    private PyObject jyObjClass;
}


public class Main {

    public static void main(String[] args) {

    /*
// with only :
    PythonInterpreter interpreter = new PythonInterpreter();

     i get : 
Exception in thread "main" Traceback (most recent call last):
  File "<string>", line 1, in <module>
LookupError: no codec search functions registered: can't find encoding 'iso8859_1'

which is probably due to the : 
#!/usr/bin/env python
# -*- coding: latin-1 -*-

// yes i am from France, so my - sorry for that - bad english ;) and have to deal with non 127 ascii chars :)
     */

    PythonInterpreter interpreter = new PythonInterpreter(null, new PySystemState());

    PySystemState sys = Py.getSystemState();
    sys.path.append(new PyString("C:/jython2.5.2/Lib"));

    interpreter.exec("from mymodule import getSomething"); 
    PyObject tmpFunction = interpreter.get("getSomething"); 
    System.err.println(tmpFunction.getClass()); 
    MyInterface i = (MyInterface) tmpFunction.__tojava__(MyInterface.class); 
    System.err.println(i.getSomething("test", " - ", true));
    for (Object x : i.getSomething("test", " - ", true)) {
        System.out.println(x);
        // How can i get back an equivallent of the Python _"for (a, b) in getSomething:"_ 
        // with _"a"_ being PyUnicode or better String, and _"b"_ being boolean ?
    }

    // ^^ so adapting Daniel Teply solution works ! Thanks to him... 
    // BTW the part below did not work : but i may have missed or/and also mixed many things :/
    // i feel Jython damned hard to dive in :/ 
    // and really hope that the sample that i post and answers that i get will help others to swim!

    try {
        MyFactory factory = new MyFactory();
        MyInterface myobj = factory.createMe();

        PyList myResult = myobj.getSomething("test", " - ", true);
        System.out.println(myResult);
    }
    catch (Exception e) {
        System.out.println(e);
        // produce a : java.lang.ClassCastException: org.python.core.PySingleton cannot be cast to MyInterface
        // EDIT : see below last edit, this error may be due to my forgotten heritage from interface in the python code!
    }

    System.exit(-1);
    }
}
</code>

Część Pythona: (mymodule.py)

<code>#!/usr/bin/env python
# -*- coding: latin-1 -*-

class MyClass:
    def __init__(selfself):
        pass
    def getSomething(self, content, glue = '', bool = True):
        for x in range(5):
            yield (glue.join(map(str, (content, x, chr(97 + x))))), bool
        #return list()

def getSomething(content, glue = '', bool = True):
    print "test"
    myclass = MyClass()
    return list(myclass.getSomething(content, glue, bool))

def main():
    test()

if __name__ == "__main__":
    main()
</code>

EDYTOWAĆ :

Częściowo odpowiadając na pytanie wewnętrzne (komentarze wewnętrzne):
(właściwie czuję, że moja odpowiedź i kod są brzydkie, ale działa i wydaje się być w porządku, aby oderwaćkrotka Nie wiem, czy jest lepszy sposób na to, by to zrobić, jeśli tak, to naprawdę mnie to interesuje :))

<code>for (Object x : i.getSomething("test", " - ", true)) {
    System.out.println(x);
    // How can i get back an equivallent of the Python _"for (a, b) in getSomething:"_ 
    // with _"a"_ being PyUnicode or better String, and _"b"_ being boolean ?

    // answering myself here :
    PyTuple mytuple = (PyTuple) x; // casting back x as PyTuple, can we have a java equivalent to _`(a, b) = x_ ? not sure...
    PyObject a = mytuple.__getitem__(0);
    PyObject b = mytuple.__getitem__(1);
    String aS = a.toString(); // mapping a unicode python string to java is as simple?
    boolean bB = b.toString().toLowerCase().equals("true");
    System.out.println(mytuple + "[" + aS + "][" + b + "][" + bB + "]");
</code>


EDYTOWAĆ:

Odpowiadając sobie na temat „produkuj:„java.lang.ClassCastException: org.python.core.PySingleton nie może być rzutowany na MyInterface”... większość mojego nieporozumienia i błędów spowodowała fakt, że zapomniałem obsługiwać Javę z części Pythona! (patrz mój kod powyżej, nie poprawiam tego faktu, ponieważ nie było to moje główne pytanie, aw jego obecnej formie jest to robocza odpowiedź na to główne pytanie, wielkie podziękowania dla Daniela i Joonasa, którzy pomogli mi zrozumieć). Tak więc dla paradygmatu fabrycznego należyNIE zapomnij dodać odpowiedni import do swojego pliku Pythona:

<code>from testjython.interfaces import MyInterface #// defining method inside a MyInterface.java

class MyClass(MyInterface):
    [...]
</code>

Inną trudnością, którą miałem, było poprawne obsłużenie importu i pakietów. BTW, dodanie tego kodu do górnego kodu spowodujeTypeError: nie można przekonwertować na org.python.core.PyList ale to kolejna sprawa ...

questionAnswers(2)

yourAnswerToTheQuestion