3. 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
4. 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
10. 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
11. Using Java classes: Easy
>>> import Foo
>>> f = Foo()
>>> type(f) Easy to use from
<type 'Foo'> within Python
>>>
http://brendel.com @BrendelConsult
12. 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
13. 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
14. 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
15. Use Python in Java?
public class Foo
{
...
public String className(Object x)
{
Class c = x.getClass();
return c.getName();
}
...
}
http://brendel.com @BrendelConsult
16. Use Python in Java?
>>> f = Foo()
>>> f.className(123)
u'java.lang.Integer'
>>>
http://brendel.com @BrendelConsult
17. 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
19. Your Python in Java?
● Java likes it static!
http://brendel.com @BrendelConsult
20. Your Python in Java?
● Java likes it static!
● Create static contract in Java:
class
abstract class
interface
http://brendel.com @BrendelConsult
21. 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
23. Create Python in Java
Yikes!
Using Python from
within Java is much
easier than creating
Python objects.
http://brendel.com @BrendelConsult
24. 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 notsouseful 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
25. More points to remember
java.lang.Exception != exceptions.Exceptions
Lots of fun when you
forget that.
http://brendel.com @BrendelConsult
26. More points to remember
No dynamic import of Java classes
(eval() or conditional import)
http://brendel.com @BrendelConsult