Jython
-
Upload
jbrendel -
Category
Technology
-
view
1.344 -
download
0
description
Transcript of Jython
http://brendel.com @BrendelConsult
Considering Jython
Juergen BrendelBrendel 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% jythonJython 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_20Type "help", "copyright", "credits" or "license" for more information.>>>
You get a standardPython shell
http://brendel.com @BrendelConsult
Jython
>>> from java.util import HashMap>>>
Very easy to import any Javaclasses 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 thanin 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 simpleclass.
http://brendel.com @BrendelConsult
Using Java classes: Easy
>>> import Foo>>> f = Foo()>>> type(f)<type 'Foo'>>>>
Easy to use fromwithin 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
>>> class Bar(Foo):... def blah(self, x):... print “Python, about to do Java”... print self.stuff(x)... print “And back to Python!”>>>
Now we inherit fromthe Java class...
... in Python!
Call some of thisobject'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 JavaThis is a test from Java: 123And 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()>>> f.className(123)u'java.lang.Integer'>>>>>> f.className(dict())u'org.python.core.PyDictionary'>>>
On the Java side yousee Java types or someJava representation of
the Python object
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:class
abstract class
interface
● Inherit Python class from that
Only then does yourPython become usable
from within Java,and only the parts that have
been statically declared.
http://brendel.com @BrendelConsult
Create Python in Java
http://brendel.com @BrendelConsult
Create Python in Java
Yikes!Using Python fromwithin Java is mucheasier than creating
Python objects.
http://brendel.com @BrendelConsult
Create Python in Java
// Get the handle on the Jython interpreterPythonInterpreter interp = new PythonInterpreter();
// Tell Jython to import something from our Python packageinterp.exec("from test_package import MyPyFooBar");
// Get the object representing the Python classPyObject pyObjectClass = interp.get("MyPyFooBar");
// 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 classFooBarInterface javaObject = (FooBarInterface)pyObject.__tojava__(FooBarInterface.class);
// Now the object can be used just as if it were a native Java objectString result = javaObject.foobar("some", "arguments", 123);System.out.println("Received from Python: " + result);
Basically, use somecopy and paste to get this
right...
http://brendel.com @BrendelConsult
More points to remember
java.lang.Exception != exceptions.Exceptions
Lots of fun when youforget that.
http://brendel.com @BrendelConsult
More points to remember
No dynamic import of Java classes
(eval() or conditional import)