Considering Jython

      Juergen Brendel
     Brendel Consulting




     http://brendel.com   @BrendelConsult
Jython



  http://jython.org




http://brendel.com   @BrendelConsult
Good reasons for Jython

  Minimize pain for Java organization

     Access to Java class library

     Embed in Java app servers

 Mix and match Python and Java code


           http://brendel.com   @BrendelConsult
Java is fast

 No GIL! Multi-threading uses multiple cores

          Object creation is faster

Much faster that cPython in number crunching




              http://brendel.com   @BrendelConsult
Jython
% jython
Jython 2.5.1 (Release_2_5_1:6813, Sep 26 2009, 13:47:54) 
[Java HotSpot(TM) Server VM (Sun Microsystems Inc.)] on java1.6.0_20
Type "help", "copyright", "credits" or "license" for more information.
>>> 




                                  You get a standard
                                     Python shell




                      http://brendel.com   @BrendelConsult
Jython
>>> from java.util import HashMap
>>> 



                                Very easy to import any Java
                             classes you have in your classpath




                http://brendel.com   @BrendelConsult
Jython
>>> from java.util import HashMap
>>> 
>>> h = HashMap()
>>> h['foo'] = 123
>>> print h
{foo=123}
>>>                          Java's HashMap easier
                              to use in Python than
                                                      in Java!




                    http://brendel.com   @BrendelConsult
Jython
>>> from java.util import HashMap
>>> 
>>> h = HashMap()
>>> h['foo'] = 123
>>> print h
{foo=123}
>>>
>>> type(h)
<type 'java.util.HashMap'>
>>>




                http://brendel.com   @BrendelConsult
Jython
>>> from java.util import HashMap
>>> 
>>> h = HashMap()
>>> h['foo'] = 123
>>> print h
{foo=123}
>>>
>>> type(h)
<type 'java.util.HashMap'>
>>>
>>> d = dict()
>>> d.update(h)
>>> print d
{u'foo': 123}
                http://brendel.com   @BrendelConsult
Using Java classes: Easy
public class Foo
{
    public String stuff(int x)
    {
        String buf =
            new String("Test from Java: ");

        buf = buf + Integer.toString(x);
        return buf;
    }
}                              So, you write your own
                                                      Java code. Here's a simple
                                                                class.


               http://brendel.com   @BrendelConsult
Using Java classes: Easy
>>> import Foo
>>> f = Foo()
>>> type(f)                           Easy to use from
<type 'Foo'>                           within Python
>>>




            http://brendel.com   @BrendelConsult
Using Java classes: Easy
>>> import Foo
>>> f = Foo()
>>> type(f)
<type 'Foo'>
>>>
>>> f.stuff(123)
u'This is a test from Java: 123'
>>>




            http://brendel.com   @BrendelConsult
Using Java classes: Easy
                                                    Now we inherit from
                                                     the Java class...
>>> class Bar(Foo):                                    ... in Python!
...     def blah(self, x):
...         print “Python, about to do Java”
...         print self.stuff(x)
...         print “And back to Python!”
>>>
                                                 Call some of this
                                              object's Java methods.




            http://brendel.com   @BrendelConsult
Using Java classes: Easy
>>> class Bar(Foo):
...     def blah(self, x):
...         print “Python, about to do Java”
...         print self.stuff(x)
...         print “And back to Python!”
>>>
>>> b = Bar()
>>> b.blah(123)
Python, about to do Java
This is a test from Java: 123
And back to Python!
>>>

            http://brendel.com   @BrendelConsult
Use Python in Java?
public class Foo
{
    ...

    public String className(Object x)
    {
        Class c = x.getClass();
        return c.getName();
    }

    ...
}

            http://brendel.com   @BrendelConsult
Use Python in Java?
>>> f = Foo()
>>> f.className(123)
u'java.lang.Integer'
>>>




            http://brendel.com   @BrendelConsult
Use Python in Java?
>>> f = Foo()                   On the Java side you
                              see Java types or some
>>> f.className(123)           Java representation of
u'java.lang.Integer'             the Python object
>>>
>>> f.className(dict())
u'org.python.core.PyDictionary'
>>>




                http://brendel.com   @BrendelConsult
Your Python in Java?




     http://brendel.com   @BrendelConsult
Your Python in Java?
●   Java likes it static!




                    http://brendel.com   @BrendelConsult
Your Python in Java?
●   Java likes it static!

●   Create static contract in Java:
         class
         abstract class
         interface




                    http://brendel.com   @BrendelConsult
Your Python in Java?
●   Java likes it static!

●   Create static contract in Java:
                                                              Only then does your
         class                                               Python become usable
                                                                from within Java,
         abstract class                                    and only the parts that have
                                                            been statically declared.
         interface

●   Inherit Python class from that



                    http://brendel.com   @BrendelConsult
Create Python in Java




     http://brendel.com   @BrendelConsult
Create Python in Java



     Yikes!
                                        Using Python from
                                        within Java is much
                                        easier than creating
                                          Python objects.




     http://brendel.com   @BrendelConsult
Create Python in Java
// Get the handle on the Jython interpreter
PythonInterpreter interp = new PythonInterpreter();

// Tell Jython to import something from our Python package
interp.exec("from test_package import MyPyFooBar");        Basically, use some
                                                                 copy and paste to get this
// Get the object representing the Python class
PyObject pyObjectClass = interp.get("MyPyFooBar");                        right...

// Instantiate an object of that class. Arguments to __call__() are the wrapped 
// arguments to __init__()
PyObject pyObject =
    pyObjectClass.__call__(new PyString("String passed in from Java"));

// Convert not­so­useful PyObject to an instance of the Java interface class
FooBarInterface javaObject =
               (FooBarInterface)pyObject.__tojava__(FooBarInterface.class);

// Now the object can be used just as if it were a native Java object
String result = javaObject.foobar("some", "arguments", 123);
System.out.println("Received from Python: " + result);

                          http://brendel.com   @BrendelConsult
More points to remember



java.lang.Exception != exceptions.Exceptions


                                           Lots of fun when you
                                                forget that.




              http://brendel.com   @BrendelConsult
More points to remember


   No dynamic import of Java classes

    (eval() or conditional import)




          http://brendel.com   @BrendelConsult
The End


juergen@brendel.com

 @BrendelConsult

http://brendel.com


  http://brendel.com   @BrendelConsult

Jython