Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Python para la Plataforma Java
          Leo Soto M.



        Encuentro Linux 2009
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
http://www.flickr.com/photos/ferruiz/4036373874/
Python para la plataforma Java
http://www.flickr.com/photos/lab2112/457187539/
¿Plataforma Java sin Java?
Plataforma Java con Java más
Python, Ruby, Scala, Groovy...
¿Por qué Python?
“Python is an experiment in how much freedom
             programmers need...”
“...Too much freedom and nobody can read
another's code; too little and expressiveness is
                 endangered”

                       - Guido van Rossum, 1996
Python
Dinámico, flexible, extremadamente legible
Jython
Dinámico, flexible, extremadamente legible

   En una plataforma ubicua, sólida
http://www.flickr.com/photos/mushon/282287572/
Status de Jython




            http://www.flickr.com/photos/digital-noise/3650559857/
2.5.1
Full compatibilidad con CPython
web2py


etree             nose


 setuptools   virtualenv
OK
¿Pero qué puedo hacer con Jython
             hoy?
GUIs
Demo con Swing
De Java a Jython
final JFrame frame = new JFrame("HelloSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,300);
frame = JFrame("HelloSwing")
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
frame.setSize(300,300)
frame = JFrame("HelloSwing",
               defaultCloseOperation=JFrame.EXIT_ON_CLOSE,
               size=(300, 300))
Container content = frame.getContentPane();
content.setLayout(new FlowLayout());
content = frame.getContentPane();
content.setLayout(new FlowLayout());
content = frame.contentPane
content.setLayout(new FlowLayout());
content = frame.contentPane
content.setLayout(FlowLayout());
content = frame.contentPane
content.layout = FlowLayout()
JButton botonSaludar = new JButton("Saludar");
JButton botonDespedir = new JButton("Despedirse");
botonSaludar.addActionListener(new ActionListener() {
	 public void actionPerformed(ActionEvent e) {
	 	 JOptionPane.showMessageDialog(frame, "Hola!");
	 }
});
botonDespedir.addActionListener(new ActionListener() {
	 public void actionPerformed(ActionEvent e) {
	 	 JOptionPane.showMessageDialog(frame, "Chao!");
	 	 frame.dispose();
	 }
});
content.add(botonSaludar);
content.add(botonDespedir);
def saludar(event):
    JOptionPane.showMessageDialog(frame, "Hola!")

def despedir(event):
    JOptionPane.showMessageDialog(frame, "Chao!")
    frame.dispose()

content.add(JButton("Saludar", actionPerformed=saludar))
content.add(JButton("Despedirse", actionPerformed=despedir))
Otra demo con Swing
(Si es que tenemos acceso a internet)
Créditos: Frank Wierzbicki
Web
Demo con Django
Y sólo por diversión...
### View
#!/usr/bin/env python
                                                            from django import http
"""
                                                            from django.template import Template, Context
WSW - the World's Shittiest Wiki.
"""
                                                            def wsw(request, title):
import re
                                                                title = urllib.unquote_plus(title) if title else "Home"
import urllib
                                                                p, created = Page.objects.get_or_create(title=title)
from django.conf import settings
                                                                form = PageForm(instance=p)
                                                                if request.method == "POST":
### Config
                                                                     form = PageForm(request.POST, instance=p)
settings.configure(
                                                                     form.save()
    DEBUG = True,
                                                                     return http.HttpResponseRedirect(request.get_full_path())
    DATABASE_ENGINE =   "doj.backends.zxjdbc.postgresql",
                                                                else:
    DATABASE_NAME   =   "wsw",
                                                                     form = PageForm(instance=p)
    DATABASE_USER   =   "wsw",
                                                                     t = Template("""<h1>{{ p.title }}</h1><ul>{% for p in
    DATABASE_PASSWORD   = "wsw",
                                                            allpages %}<li><a href="{{ p }}">{{ p }}</a></li>{% endfor %}
    ROOT_URLCONF    =   __name__)
                                                            </ul><form action="{{ request.get_full_path }}" method="POST">
                                                            <p>{{ form.content }}</p><input type="submit"></form>""")
### Model
                                                                wikiwords = re.findall(
from django.db import models
                                                                         '[A-Z][a-z]+[A-Z][a-z]+(?:[A-Z][a-z]+)*', p.content)
                                                                allpages = [
class Page(models.Model):
                                                                         page.title for page in Page.objects.order_by('title')]
    title = models.CharField(max_length=300,
                                                                allpages.extend(
                             primary_key=True)
                                                                         word for word in wikiwords if word not in allpages)
    content = models.TextField()
                                                                return http.HttpResponse(t.render(Context(locals())))
    class Meta:
                                                            ### Main
        app_label = "wsw"
                                                            if __name__ == '__main__':
                                                                from django.core import management
### URLs
                                                                from django.db import connection
from django.conf.urls.defaults import *
                                                                from django.core.management.color import no_style
                                                                cursor = connection.cursor()
urlpatterns = patterns(__name__, ('(.*)', 'wsw'))
                                                                statements, _ = connection.creation.sql_create_model(
                                                                         Page, no_style())
### Form
                                                                try:
from django.forms import ModelForm
                                                                     for sql in statements:
                                                                         cursor.execute(sql)
class PageForm(ModelForm):
                                                                     connection.connection.commit()
    class Meta:
                                                                except:
        model = Page
                                                                     pass
        fields = ['content']
                                                                management.call_command('runserver')
Créditos: Jacob Kaplan-Moss
Testing




   http://www.flickr.com/photos/emotionaltoothpaste/26034597/
DocTests
def factorial(n):
                                         It must also not be ridiculously large:
    """Return the factorial of n, an
                                         >>> factorial(1e100)
    exact integer >= 0.
                                         Traceback (most recent call last):
                                             ...
   If the result is small enough to
                                         OverflowError: n too large
   fit in an int, return an int.
                                         """
   Else return a long.

                                         import math
   >>> [factorial(n)
                                         if not n >= 0:
   ... for n in range(6)]
                                             raise ValueError("n must be >= 0")
   [1, 1, 2, 6, 24, 120]
                                         if math.floor(n) != n:
   >>> [factorial(long(n))
                                             raise ValueError(
   ... for n in range(6)]
                                                 "n must be exact integer")
   [1, 1, 2, 6, 24, 120]
                                         if n+1 == n: # catch a value like 1e300
   >>> factorial(30)
                                             raise OverflowError("n too large")
   265252859812191058636308480000000L
                                         result = 1
   >>> factorial(30L)
                                         factor = 2
   265252859812191058636308480000000L
                                         while factor <= n:
   >>> factorial(-1)
                                             result *= factor
   Traceback (most recent call last):
                                             factor += 1
       ...
                                         return result
   ValueError: n must be >= 0

   Factorials of floats are OK, but
   the float must be an exact integer:
   >>> factorial(30.1)
   Traceback (most recent call last):
       ...
   ValueError: n must be exact integer
   >>> factorial(30.0)
   265252859812191058636308480000000L
Demo: DocTests + HtmlUnit
Demo: DocTests + HtmlUnit
         ¿Ah?
¡Tests de Integración para web apps!
Oh, para eso tenemos Selenium, ¿no?
Jython: Python para la plataforma Java (EL2009)
Ejecutar en el browser tarda muuuuucho




                    http://www.flickr.com/photos/tambako/498552755/
Run headless...
Run headless...




...con HtmlUnit!
Demo: DocTests + HtmlUnit
Más Testing




       http://www.flickr.com/photos/emotionaltoothpaste/26034597/
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
¿Por cierto, quien más usa Jython?
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
Jython: Python para la plataforma Java (EL2009)
EADS




http://www.flickr.com/photos/nguyendai/694158734/
Lockheed Martin




http://www.flickr.com/photos/rcsj/2504022678/
¿Y dónde puedo aprender más?
jythonbook.com
jythonbook.com
¡Gracias!
      Contacto:

       @leosoto
http://blog.leosoto.com
¿Preguntas?
      Contacto:

       @leosoto
http://blog.leosoto.com

More Related Content

Jython: Python para la plataforma Java (EL2009)