Introducción A Python
Introducción A Python
This work is licensed under the Creative Commons Attribution License. To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305,
Introduccin a Python
Sobre el cursillo
El cursillo est entre los Cursillos de Julio de los grupos de inters de la Universidad de Deusto
Cursillos de Julio
Desde hace varios aos, alumnos y alumnas de la Facultad de Ingeniera de la Universidad de Deusto organizan de manera voluntaria una serie de cursillos que abarcan diversas reas de conocimiento Cuenta con el apoyo de profesores y de la Facultad de Ingeniera ESIDE, que anima e impulsa estas actividades facilitando el uso de aulas informatizadas y dems recursos para que su realizacin sea lo mejor posible
Compartir conocimiento! Ayudar a dar los primeros pasos de una tecnologa, lenguaje de programacin etc.
En consecuencia: En un cursillo se abarcan la mxima cantidad de temas en el mnimo tiempo posible. No es posible profundizar mucho en cada tema, pero s ver lo suficiente para que el/la alumno/a pueda seguir aprendiendo por su cuenta, una vez dados los primeros pasos Cursillos introductorios, no exhaustivos
Este concretamente se da desde el grupo de software libre de la Universidad (el e-ghost) con colaboracin del MoreLab.
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Contenido
Introduccin a Python
Programacin modular Orientacin a objetos XUnit Bases de Datos XML GUI Aspectos ms avanzados de Python
Introduccin a Python
Python
Da este nombre al lenguaje inspirado por el popular grupo cmico britnico Monty Python
Guido cre Python durante unas vacaciones de navidad en las que (al parecer) se estaba aburriendo
Introduccin a Python
#!/usr/bin/env python print "Hola Mundo" # "Hola Mundo" print "hola", "mundo" # "hola mundo" print "Hola" + "Mundo" # "HolaMundo"
Introduccin a Python
Caractersticas de Python I
Muy difcil escribir cdigo ofuscado Minimalista: todo aquello innecesario no hay que escribirlo (;, {, }, '\n') Muy denso: poco cdigo hace mucho Soporta objetos y estructuras de datos de alto nivel: strings, listas, diccionarios, etc. Mltiples niveles de organizar cdigo: funciones, clases, mdulos, y paquetes
Simple y poderoso
Si hay reas que son lentas se pueden reemplazar por plugins en C o C++, siguiendo la API para extender o empotrar Python en una aplicacin, o a travs de herramientas como SWIG, sip o Pyrex.
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Caractersticas de Python II
De scripting
No tienes que declarar constantes y variables antes de utilizarlas No requiere paso de compilacin/linkage La primera vez que se ejecuta un script de Python se compila y genera bytecode que es luego interpretado Alta velocidad de desarrollo y buen rendimiento
Cdigo interoperable (como en Java "write once run everywhere") Se puede utilizar en mltiples plataforma (ms an que Java) Puedes incluso ejecutar Python dentro de una JVM (Jython) o de un .NET Runtime (IronPython), mviles de la serie 60 de Nokia... (ver directorio examples/interpretes) Open source
Razn por la cual la Python Library sigue creciendo Puedes hacer en Python todo lo que puedes hacer con C# o Java, o ms
De propsito general
Introduccin a Python
Peculiaridades sintcticas
Tabula una vez para indicar comienzo de bloque Des-tabula para indicar el final del bloque Cdigo en Python if x: if y: f1() f2()
Introduccin a Python
Amplio abanico de tipos de datos Soporte para threads Tipado esttico Y mucho ms ... No ofrece tipado esttico
Todo lo que puedes hacer con Java o .NET tambin lo puedes hacer con Python
Incluso puedes acceder a travs de Python a las API de Java si usas Jython o a las de .NET si usas IronPython
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Python es de demasiado alto nivel, no hay control directo sobre memoria y otras tareas de bajo nivel No hay nada mejor para este tipo de aplicaciones que el viejo C
Python es ideal:
Como lenguaje "pegamento" para combinar varios componentes juntos Para llevar a cabo prototipos de sistema Para la elaboracin de aplicaciones cliente Para desarrollo web y de sistemas distribuidos Para el desarrollo de tareas cientficas, en los que hay que simular y prototipar rpidamente
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Instalar Python
Introduccin a Python
Versiones en Python
Rama 2.x
En el aula est instalado Python 2.4 En versiones ms actualizadas de Ubuntu o Debian est disponible Python 2.5 Limpia y reestructura Python
Incompatible con la rama 2.x Python 2.6 convivir con Python 3.x
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Un comando simple:
>>> print "Hola Mundo" Hola Mundo >>>
Para salir del intrprete Ctrl-D (en Linux) o Ctrl-Z (en Windows) o:
>>> import sys >>> sys.exit() $
Introduccin a Python
Introduccin a Python
Sentencias y bloques
Las sentencias acaban en nueva lnea, no en ; Los bloques son indicados por tabulacin que sigue a una sentencia acabada en ':'. E.j. (bloque.py):
# comentarios de lnea se indican con carcter '#' name = "Diego1" # asignacin de valor a variable if name == "Diego": print "Aupa Diego" else: print "Quin eres?" print "No eres Diego!" $ python bloque.py Quin eres? No eres Diego!
Introduccin a Python
Identificadores
Deben empezar con un carcter no numrico y contener letras, nmeros y '_' Python es case sensitive (sensible a la capitalizacin) and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass print raise return try while yield __name__ nombre de funcin __doc__ documentacin sobre una funcin __init__() constructor de una clase __dict__, diccionario utilizado para guardar los atributos de un objeto
e-ghost ESIDE Universidad de Deusto
Palabras reservadas:
Introduccin a Python
Tipos de datos I
Introduccin a Python
Tipos de datos II
Dos string juntos sin delimitador se unen >>> print "Hi" "there" Hithere Los cdigos de escape se expresan a travs de '\': >>>print '\n' Raw strings >>> print r'\n\\' # no se 'escapa' \n Lo mismo ' que ", p.e. "\\[foo\\]" r'\[foo\]' Algunos de los mtodos que se pueden aplicar a un string son: >>> len('La vida es mucho mejor con Python.') >>> 34 >>> 'La vida es mucho mejor con Python.'.upper() 'LA VIDA ES MUCHO MEJOR CON PYTHON' >>> "La vida es mucho mejor con Python".find("Python") 27 >>> "La vida es mucho mejor con Python".find('Perl') -1 >>> 'La vida es mucho mejor con Python'.replace('Python', 'Jython') 'La vida es mucho mejor con Jython'
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Tipos de datos IV
Para poder escribir caracteres con acentos es necesario introducir la siguiente lnea al comienzo de un programa Python:
Introduccin a Python
Tipos de datos V
Listas []
Indexadas por un entero comienzan en 0: >>> meses = ["Enero", "Febrero"] >>> print meses[0] Enero >>> meses.append("Marzo") >>> print meses ['Enero', 'Febrero', 'Marzo'] Dos puntos (:) es el operador de rodajas, permite trabajar con una porcin de la lista, el elemento indicado por el segundo parmetro no se incluye: >>> print meses[1:2] ['Febrero'] Ms (+) es el operador de concatenacin: >>> print meses+meses ['Enero', 'Febrero', 'Marzo', 'Enero', 'Febrero', 'Marzo']
Introduccin a Python
Tipos de datos VI
>>> meses.append (meses) >>> print meses ['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ]] >>> meses.append(1) ['Enero', 'Febrero', 'Marzo', ['Enero', 'Febrero', 'Marzo' ], 1]
Para usar una lista como una pila, se pueden usar append y pop:
items.append(555) items [-1, 4, 6, 555] items.pop() items [-1, 4, 6]
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Tuplas (), lo mismo que listas, pero no se pueden modificar python@cursillos:~$ python Python 2.5.1 (r251:54863, May 2 2007, 16:56:35) [GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2 Type "help", "copyright", "credits" or "license" for more information.
>>> mitupla = ('a', 1, "hola") >>> mitupla[2] 'hola' >>> dir(mitupla) ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__str__']
Introduccin a Python
Diccionarios {} arrays asociativos o mapas, indexados por una clave, la cual puede ser cualquier objeto Python, aunque normalmente es una tupla:
>>> mydict = {"altura" : "media", "habilidad" : "intermedia", "salario" : 1000 } >>> print mydict {'altura': 'media', 'habilidad': 'intermedia', 'salario': 1000} >>> print mydict["habilidad"] intermedia Puedes comprobar la existencia de una clave en un diccionario usando has_key:
if mydict.has_key('altura'): print 'Nodo encontrado'
Introduccin a Python
E.j. (condicional.py)
q = 4 h = 5 if q < h : print "primer test pasado" elif q == 4: print q tiene valor 4 else: print "segundo test pasado" >>> python condicional.py primer test pasado
Operadores booleanos: "or," "and," "not" Operadores relacionales: ==, >, <, !=
Introduccin a Python
Se puede usar sobre cualquier tipo de datos que sea una secuencia (lista, tupla, diccionario)
La funcin range crea una secuencia descrita por ([start,] end [,step]), donde los campos start y step son opcionales. Start es 0 y step es 1 por defecto.
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
while es otra sentencia de repeticin. Ejecuta un bloque de cdigo hasta que una condicin es falsa. break nos sirve para salir de un bucle Por ejemplo:
reply = 'repite' while reply == 'repite': print 'Hola' reply = raw_input('Introduce "repite" para hacerlo de nuevo: ') Hola Introduce "repite" para hacerlo de nuevo: repite Hola Introduce "repite" para hacerlo de nuevo: adis
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Funciones
Introduccin a Python
Funciones
# funcionargumentosvariablesyconclave.py def testArgLists_1(*args, **kwargs): print 'args:', args print 'kwargs:', kwargs testArgLists_1('aaa', 'bbb', arg1='ccc', arg2='ddd') def testArgLists_2(arg0, *args, **kwargs): print 'arg0: "%s"' % arg0 print 'args:', args print 'kwargs:', kwargs print '=' * 40 testArgLists_2('un primer argumento', 'aaa', 'bbb', arg1='ccc', arg2='ddd')
Visualizara:
args: ('aaa', 'bbb') kwargs: {'arg1': 'ccc', 'arg2': 'ddd'} ======================================== arg0: "un primer argumento" args: ('aaa', 'bbb') kwargs: {'arg1': 'ccc', 'arg2': 'ddd'}
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Clases
Una clase contiene una coleccin de mtodos. Cada mtodo contiene como primer parmetro (self) que hace referencia a un objeto
self equivalente a this en C++ Existe un soporte limitado para variables privadas mediante name mangling.
Un identificador __spam es reemplazado por _classname__spam. El identificador es todava accesible por _classname__spam.
Introduccin a Python
Clases
# clasepinguinos.py class PenguinPen: def __init__(self): self.penguinCount = 0 def add (self, number = 1): """ Add penguins to the pen. The default number is 1 """ self.penguinCount = self.penguinCount + number def remove (self, number = 1): """ Remove one or more penguins from the pen """ self.penguinCount = self.penguinCount - number def population (self): """ How many penguins in the pen? """ return self.penguinCount def __del__(self): pass penguinPen = PenguinPen() penguinPen.add(5) # Tux y su familia print penguinPen.population()
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ms clases
# clasesherencia.py class Basic: def __init__(self, name): self.name = name def show(self): print 'Basic -- name: %s' % self.name class Special(Basic): # entre parntesis la clase base def __init__(self, name, edible): Basic.__init__(self, name) # se usa Basic para referir a self.upper = name.upper() # clase base self.edible = edible def show(self): Basic.show(self) print 'Special -- upper name: %s.' % self.upper, if self.edible: print "It's edible." else: print "It's not edible." def edible(self): return self.edible
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Probando clases
obj1 = Basic('Manzana') obj1.show() print '=' * 30 obj2 = Special('Naranja', True) obj2.show()
Visualizara:
Basic -- name: Manzana ============================== Basic -- name: Naranja Special -- upper name: NARANJA. It's edible.
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Excepciones
Cada vez que un error ocurre se lanza una excepcin, visualizndose un extracto de la pila del sistema. E.j. excepcion.py:
#!/usr/bin/python print a $ python exception.py Traceback (innermost last): File "exception.py", line 2, in ? print a NameError: a
Introduccin a Python
Excepciones personalizadas
# excepcionpersonalizada.py class E(Exception): def __init__(self, msg): Exception.__init__(self,msg) try: raise E('mi mensaje de error') except E, obj: print 'Msg:', obj.message
Visualizara:
Introduccin a Python
Mdulos
Un mdulo es una coleccin de mtodos en un fichero que acaba en .py. El nombre del fichero determina el nombre del mdulo en la mayora de los casos. E.j. modulo.py:
def one(a): print "in one" def two (c): print "in two"
Uso de un mdulo:
>>> import modulo >>> dir(modulo) # lista contenidos mdulo ['__builtins__', '__doc__', '__file__', '__name__', 'one', 'two'] >>> modulo.one(2) in one
Introduccin a Python
Mdulos II
import hace que un mdulo y su contenido sean disponibles para su uso. Algunas formas de uso son:
import test Importa modulo test. Referir a x en test con "test.x". from test import x Importa x de test. Referir a x en test con "x". from test import * Importa todos los objetos de test. Referir a x en test con "x". import test as theTest Importa test; lo hace disponible como theTest. Referir a objecto x como "theTest.x".
Introduccin a Python
Paquetes I
Un paquete es una manera de organizar un conjunto de mdulos como una unidad. Los paquetes pueden a su vez contener otros paquetes. Para aprender como crear un paquete consideremos el siguiente contenido de un paquete:
package_example/ package_example/__init__.py package_example/module1.py package_example/module2.py
Introduccin a Python
Paquetes II
# module1.py class class1: def __init__(self): self.description = 'class #1' def show(self): print self.description # module2.py class class2: def __init__(self): self.description = 'class #2' def show(self): print self.description
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Paquetes III
# testpackage.py import package_example c1 = package_example.class1() c1.show() c2 = package_example.class2() c2.show() Visualizara: class #1 class #2 La localizacin de los paquetes debe especificarse o bien a travs de la variable de entorno PYTHONPATH o en cdigo del script mediante sys.path
Introduccin a Python
Manejo de ficheros
Introduccin a Python
Ejercicio divertido!
El Viernes pasado fue la gala y todo el mundo est subiendo fotos a Picasa Web
Instalando picasa puedes bajar lbumes enteros En GNU/Linux picasa no va lo bien que podra ir :-(
Usemos Python!
Introduccin a Python
Ejercicio divertido!
Queremos bajarnos este lbum Nos bajamos de aqu un documento XML que indexa todas las fotos
Introduccin a Python
Ejercicio divertido!
Abrir el fichero y leerlo entero. Coger los textos entre <photo:imgsrc> y </photo:imgsrc> Guardar esos textos en otro fichero (salida.txt, por ejemplo) $ wget -i salida.txt y nos abremos bajado todas las fotos!
Introduccin a Python
Pistas Ejercicio
Mtodos de str
hola.split(ol) devuelve ['h','a'] contenido = fichero.read() fichero.write( mensaje + \n ) entender el \n si es un fichero de texto
Mtodos de fichero
Mtodo de escritura
Introduccin a Python
Mejoras Ejercicio
Controlar excepciones
try..finally para hacer siempre close de ficheros abiertos try..except para controlar excepciones en el bloque import sys
Parametrizarlo y modularizarlo
sys.argv
if __name__ == '__main__'
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ms sobre print
print (printredirect.py)
stdout en Python es sys.stdout, stdin es sys.stdin: import sys class PrintRedirect: def __init__(self, filename): self.filename = filename def write(self, msg): f = file(self.filename, 'a') f.write(msg) f.close() sys.stdout = PrintRedirect('tmp.log') print 'Log message #1' print 'Log message #2' print 'Log message #3'
Introduccin a Python
# variableglobal.py NAME = "Manzana" def show_global(): name = NAME print '(show_global) nombre: %s' % name def set_global(): global NAME NAME = 'Naranja' name = NAME print '(set_global) nombre: %s' % name show_global() set_global() show_global()
Lo cual visualizara:
Introduccin a Python
PyUnit
Introduccin a Python
xUnit
xUnit
Mismos conceptos, bajo diferentes lenguajes Original: Kent Beck con SUnit (para Smalltalk)
Introduccin a Python
Tenemos suites de pruebas (TestSuite) Cada suite tendr una serie de casos de pruebas (TestCase) Cada caso de pruebas tendr una instalacin (Fixture) para crear el entorno necesario para ejecutar las pruebas Cada caso de pruebas tendr, a su vez, las pruebas
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Los diferentes casos los implementamos en clases que heredan de de unittest.TestCase Dentro definiremos el fixture con los mtodos setUp y tearDown, que son
invocados antes y despus de cada test El nombre de cada test comenzar por un nombre que podemos proveer, pero que por defecto es test (testSuma, testResta)
Introduccin a Python
assertEquals(esperado, obtenido [,mensaje]) assertTrue(obtenido [,mensaje]) assertRaises(excepcin, funcin, args, kargs) fail([mensaje]) assertAlmostEqual, assertAlmostEquals, assertEqual, assertEquals, assertFalse, assertNotAlmostEqual, failIfEqual, failUnlessAlmostEqual...
e-ghost ESIDE Universidad de Deusto
Muchos ms (dir(unittest.TestCase)):
Introduccin a Python
Para ejecutar, meteremos todos los TestCases en suites, y ejecutaremos estos suites
Introduccin a Python
Ms sobre pruebas
Pruebas unitarias
una de las piedras angulares de metodologas de desarrollo gil como Extreme Programming Dotan de mucha robustez al proyecto Facilitan la refactorizacin de cdigo Facilitan la comprensin del cdigo Permiten definir claramente qu hace el cdigo
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Test first
Introduccin a Python
Test first
Ciclo:
a) Aadir test rpidamente b) Ejecutar tests (y ver que el nuevo falla) c) Aadir pequeo cdigo funcional d) Ejecutar tests (y ver que el nuevo funciona) e) Refactorizar para eliminar cdigo duplicado
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ejercicio divertido!
A partir de ahora, vamos a trabajar en un Tres en Raya que cubra el temario del cursillo Y vamos a empezar por crear una clase State que cumpla una serie de tests que pongamos
Carpeta examples/tdd
Introduccin a Python
Serializacin de objetos
Para serializar una jerarqua de objetos, creas un Pickler, y luego llamas al mtodo dump(), o simplemente invocas el mtodo dump() del mdulo pickle Para deserializar crear un Unpickler e invocas su mtodo load() method, o simplemente invocas el mtodo load() del mdulo pickle
Se serializa el contenido del objeto __dict__ de la clase, si se quiere cambiar este comportamiento hay que sobrescribir los mtodos __getstate__() y __setstate__().
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Programacin de BD en Python
Para conectarnos a una base de datos usamos el mtodo connect del mdulo de base de datos utilizado que devuelve un objeto de tipo connection El objeto connection define el mtodo cursor() que sirve para recuperar un cursor de la BD
Otros mtodos definidos en connection son close(), commit(), rollback() execute() nos permite enviar una sentencia SQL a la BD fetchone() recuperar una fila fetchall() recuperar todas las filas DCOracle (http://www.zope.org/Products/DCOracle/) creado por Zope MySQLdb (http://sourceforge.net/projects/mysql-python)
Etc.
Introduccin a Python
Desarrollada por MySQL AB, compaa sueca cuyo negocio se basa en labores de consultora sobre MySQL
http://www.mysql.com
Diseada para:
Desarrollo de aplicaciones crticas Sistemas con altos requerimientos de carga Ser embebida en software
Introduccin a Python
Instalacin MySQL
En la siguiente URL se pueden obtener RPMs y ejecutables para instalar la ltima versin de produccin de MySQL (5.0) tanto en Linux como Windows:
http://dev.mysql.com/downloads/mysql/5.0.h tml
Introduccin a Python
Creamos una base de datos de nombre deusto a la que podemos hacer login con usuario deusto y password deusto, a travs del siguiente SQL:
CREATE DATABASE deusto; GRANT ALTER, SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON deusto.* TO deusto@'%' IDENTIFIED BY 'deusto'; GRANT ALTER, SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON deusto.* TO deusto@localhost IDENTIFIED BY 'deusto'; use deusto; CREATE TABLE EVENTOS(ID int(11) NOT NULL PRIMARY KEY, NOMBRE VARCHAR(250), LOCALIZACION VARCHAR(250), FECHA bigint(20), DESCRIPCION VARCHAR(250)); INSERT INTO EVENTOS VALUES (0, 'SEMANA ESIDE', 'ESIDE-DEUSTO', 0, 'Charla sobre Python');
Introduccin a Python
Introduccin a Python
Visualizando lo siguiente:
$ python accesodbeventosMySQL.py [0, 'Cursillos de Julio', 'ESIDE-DEUSTO', 1, 'Cursillo Python'] [1, 'Otro evento', 'Otro lugar', 1, 'Curso ...']
Introduccin a Python
SQLite
No tiene ningn demonio por detrs: se almacenan los datos en un nico fichero Es realmente pequea: no exige casi recursos, no tiene dependencias Funcionalidad muy limitada en comparacin con otras BD Multiplataforma Utilizada por aplicaciones de escritorio http://www.sqlite.org/
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Visualizando lo siguiente:
$ python accesodbeventosSQLite.py [0, 'Cursillos de Julio', 'ESIDE-DEUSTO', 1, 'Cursillo Python'] [1, 'Otro evento', 'Otro lugar', 1, 'Curso ...']
Introduccin a Python
Python DB API I
Pero si es lo mismo! S:
los diferentes mdulos de bases de datos implementan la Python Database API Specification http://www.python.org/dev/peps/pep-0249/
Los mdulos (sqlite, MySQLdb...) cumplen el interfaz (mtodo connect, cursores, excepciones...)
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Python DB API II
En SQLite no tiene sentido host, user ni password, por ejemplo Como recibe *args, no es problema ponerlos, el mdulo sqlite ignorar los que no le interese
Introduccin a Python
Utilizando DBI - I
# db/accesodbeventosDBI.py #Una de las dos siguientes: import sqlite as dbi #import MySQLdb as dbi import time, sys def executeSQLCommand(cursor, command): rowSet = [] command = command.strip() if len(command): try: cursor.execute(command) # Ejecuta el comando if command.lower().startswith('select'): # si es select lines = cursor.fetchall() # recuperar todos los resultados for line in lines: row = [] for column in line: row.append(column) rowSet.append(row) except dbi.ProgrammingError, e: print e sys.exit() return rowSet
Introduccin a Python
Utilizando DBI - II
if __name__ == '__main__': db=dbi.connect(host=localhost,user=deusto,passwd=deusto,db="deusto") cursor = db.cursor() executeSQLCommand(cursor, "update eventos set fecha=" + str(time.time()*1000)) rowSet = executeSQLCommand(cursor, "select * from eventos") for row in rowSet: print row del cursor
Visualizando lo siguiente:
$ python accesodbeventosDBI.py [0, 'Cursillos de Julio', 'ESIDE-DEUSTO', 1, 'Cursillo Python'] [1, 'Otro evento', 'Otro lugar', 1, 'Curso ...']
Introduccin a Python
Introduccin a Python
if __name__ == '__main__': if len(sys.argv) != 2: print >> sys.stderr, "Usage: python %s LOCALIZACION" % sys.argv[0] sys.exit(1) db=dbi.connect(host=localhost,user=deusto,passwd=deusto,db="deusto") cursor = db.cursor() executeSQLCommand(cursor, "update eventos set fecha=" + str(time.time()*1000)) rowSet = executeSQLCommand(cursor, "select * from EVENTOS where LOCALIZACION = '"+sys.argv[1]+"'") for row in rowSet: print row del cursor
Visualizando lo siguiente:
Introduccin a Python
$ python accesodbeventosDBIParametros.py "loquesea' or 1 = 1 --" [0, 'Cursillos de Julio', 'ESIDE-DEUSTO', 1, 'Cursillo Python'] [1, 'Otro evento', 'Otro lugar', 1, 'Curso ...']
Introduccin a Python
Para evitar SQL Injection, en DBI pasaremos los parmetros a la sentencia execute:
qmark
Introduccin a Python
Introduccin a Python
if __name__ == '__main__': if len(sys.argv) != 2: print >> sys.stderr, "Usage: python %s LOCALIZACION" % sys.argv[0] sys.exit(1) db=dbi.connect(host=localhost,user=deusto,passwd=deusto,db="deusto") cursor = db.cursor() executeSQLCommand(cursor, "update eventos set fecha=" + str(time.time()*1000)) rowSet = executeSQLCommand(cursor, "select * from EVENTOS where LOCALIZACION = %s",sys.argv[1]) for row in rowSet: print row del cursor
Introduccin a Python
Ejercicio!
Introduccin a Python
Ejercicio!
get_scores(self)
Introduccin a Python
Programacin de sistemas
Python permite la programacin de sistema tanto accediendo a la API de Windows ( http://www.python.org/windows/index.html) como a las llamadas al sistema de UNIX (mdulo os) El mdulo os nos da acceso a:
El entorno del proceso: getcwd(), getgid(), getpid() Creacin de ficheros y descriptores: close(), dup(), dup2(), fstat(), open(), pipe(), stat(), socket() Gestin de procesos: execle(), execv(), kill(), fork(), system() Gestin de memoria mmap() En la documentacin del mdulo viene la disponibilidad de la funcin en diferentes sistemas
Introduccin a Python
Gestin de Hilos - I
import thread def f(nombre): numero = thread.start_new_thread(f,('hola',)) #funcion, tupla con argumentos #automticamente se habr lanzado
Introduccin a Python
Gestin de Hilos - II
threading
from threading import * class MiHilo(Thread): def __init__(self,nombre): Thread.__init__(self) self.nombre = nombre def run(self): print Hola %s,self.nombre m = MiHilo(gente) m.start()
Introduccin a Python
l = threading.Lock() l.acquire() #Cuando un hilo entra en acquire(), el resto de hilos que llamen al acquire del #mismo lock se quedan bloqueados, hasta que alguien llame a release l.release() (threading/ejemplo-sincronizacion.py)
Introduccin a Python
Un documento XML puede ser fcilmente procesado y sus datos manipulados Existen APIs para procesar esos documentos en Java, C, C++, Perl.. (y por supuesto Python) XML define datos portables al igual que Java define cdigo portable
Introduccin a Python
Instrucciones de procesamiento (processing instructions PI) Declaraciones de tipo de documento Comentarios Elementos Referencias a entidades Secciones CDATA
Introduccin a Python
Introduccin a Python
XML Parsing
Parser XML
Introduccin a Python
SAX
Define interfaz dirigido por eventos (eventdriven) para el procesamiento de un documento XML Definido por David Megginson y lista correo XML-DEV : http:// www.megginson.com/SAX
DOM
Provee una representacin de un documento XML en forma de un rbol Carga todo el documento XML en memoria http://www.w3.org/DOM
Introduccin a Python
Introduccin a Python
Caractersticas de SAX
Detecta cundo empieza y termina un elemento o el documento, o un conjunto de caracteres, etc. (genera eventos) Gestiona los espacios de nombres Comprueba que el documento est bien formado
Las aplicaciones necesitan implementar manejadores de los eventos notificados SAX lee secuencialmente de principio a fin, sin cargar todo el documento en memoria Ventaja: eficiencia en cuanto al tiempo y la memoria empleados en el anlisis Desventaja: no disponemos de la estructura en rbol de los documentos
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
startElement & characters startElement & characters endElement startElement startElement & characters startElement & characters endElement
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Soporte para SAX en Python es ofrecido por el mdulo xml.sax de la Python Library Define 2 mtodos:
make_parser([parser_list])
El mdulo xml.sax.xmlreader define readers para SAX El mdulo xml.sax.handler define manejadores de eventos para SAX: startDocument, endDocument, starElement, 2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto endElement
Introduccin a Python
Introduccin a Python
Introduccin a Python
Documentos XML son tratados como un rbol de nodos Cada elemento es un nodo Los elementos hijos y el texto contenido dentro de un elemento son subnodos W3C DOM Site: http://www.w3.org/DOM/
Introduccin a Python
Caractersticas DOM
Documento se carga totalmente en memoria en una estructura de rbol Ventaja: fcil acceder a datos en funcin de la jerarqua de elementos, as como modificar el contenido de los documentos e incluso crearlos desde cero. Desventaja: coste en tiempo y memoria que conlleva construir el rbol
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Element un elemento XML Attribute un attributo Text texto contenido en un elemento o atributo CDATAsection seccin CDATA EntityReference Referencia a una entidad Entity Indicacin de una entidad XML ProcessingInstruction Una instruccin de procesamiento Comment Contenido de un comentario de XML Document El objeto documento DocumentType Referencia al elemento DOCTYPE DocumentFragment Referencia a fragmento de documento Notation Contenedor de una anotacin
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Node un nodo en el rbol de un documento NodeList una lista de objetos nodos NamedNodeMap permite interaccin y acceso por nombre a una coleccin de atributos
Introduccin a Python
Introduccin a Python
Pelculas
Pelcula
...
Pelcula
codigo=1
codigo=5
titulo=Malena
diirector=Victor Fleming
diirector=Giuseppe Tornatore
Introduccin a Python
Python provee el mdulo xml.dom.minidom que es una implementacin sencilla de DOM El mtodo parse a partir de un fichero crea un objeto DOM, el cual tiene todos los mtodos y atributos estndar de DOM: hasChildNodes(), childNodes, getElementsByTagName() Para ms informacin sobre procesamiento XML en Python ir a: http:// pyxml.sourceforge.net/topics/
El mdulo PyXML, que no viene en la distribucin por defecto de Python, permite procesamiento un poco ms sofisticado
http://pyxml.sourceforge.net/topics/
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ejemplo DOM I
# xml/ejemploDOM.py # Ejecutar: python ejemploDOM.py Cartelera.xml #!/usr/bin/env python import xml.dom.minidom, sys class Pelicula: def __init__(self, codigo, titulo, director, actores): self.codigo = codigo self.titulo = titulo self.director = director self.actores = actores def __repr__(self): return "Codigo: " + str(self.codigo) + " - titulo: " + self.titulo + " - director: " + self.director + " - actores: " + self.actores class PeliculaDOMParser: def __init__(self, filename): self.dom = xml.dom.minidom.parse(filename) self.peliculas = []
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ejemplo DOM II
def getPeliculas(self): if not self.peliculas: peliculaNodes = self.dom.getElementsByTagName("Pelicula") numPelis = len(peliculaNodes) for i in range(numPelis): pelicula = peliculaNodes.item(i) # Recuperar los attributes de cada nodo Pelicula peliAttribs = pelicula.attributes codigo = peliAttribs.getNamedItem("codigo").nodeValue titulo = peliAttribs.getNamedItem("titulo").nodeValue director = peliAttribs.getNamedItem("director").nodeValue actores = peliAttribs.getNamedItem("actores").nodeValue self.peliculas.append(Pelicula(codigo,titulo,director,actores)) return self.peliculas if __name__ == '__main__': domParser = PeliculaDOMParser(sys.argv[1]) for peli in domParser.getPeliculas(): print peli
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Con la diversidad de lenguajes de presentacin que hay (WML, HTML, cHTML) existen dos alternativas para desarrollar las aplicaciones:
Desarrollar versiones de los procesos de generacin de presentacin (JSP, ASP, CGI,..) para cada lenguaje. Desarrollar solo una versin que genere XML y conversores de XML a los lenguajes de presentacin.
Introduccin a Python
Dos partes:
XSLT transforma un documento XML en otro documento XML XSLFO formatea y estiliza documentos en varios modos XSLT W3C Recommendation http://www.w3.org/TR/xslt
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Ventajas:
No asume un nico formato de salida de documentos Permite manipular de muy diversas maneras un documento XML: reordenar elementos, filtrar, aadir, borrar, etc. Permite acceder a todo el documento XML XSLT es un lenguaje XML Su utilizacin es ms compleja que un lenguaje de programacin convencional Consume cierta memoria y capacidad de proceso DOM detrs
Desventajas:
Introduccin a Python
El documento XML a transformar (students.xml) La hoja de estilo que especifica la transformacin (students.xsl)
Introduccin a Python
Introduccin a Python
Introduccin a Python
Resultado de transformacin
(students.html)
<HTML> <HEAD> <TITLE>Name of students</TITLE> </HEAD> <BODY> <P>Usue Artaza</P> <P>Iigo Urrutia</P> </BODY> </HTML>
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
XSLT en Python
http://uche.ogbuji.net/tech/akara/nodes/2003-01-01/ python-xslt
En la siguiente url podemos encontrar adaptaciones Python de las libreras de la toolkit Gnome en C Libxml y Libxslt:
http://xmlsoft.org/python.html (Linux) http://users.skynet.be/sbi/libxml-python/ (Windows) El ejemplo en la siguiente pgina ilustra el uso de esta librera
Introduccin a Python
Ejemplo XSLT
# Instalar fichero libxml2-python-2.6.16.win32-py2.4.exe # Ejecutar: python xsltexample.py Cartelera.xml Cartelera.xsl transform.html import libxml2 import libxslt import sys if len(sys.argv) != 4: print 'Usage: python xsltexample <xml-file> <xslt-file> <output-file>' sys.exit(0) else: styledoc = libxml2.parseFile(sys.argv[2]) style = libxslt.parseStylesheetDoc(styledoc) doc = libxml2.parseFile(sys.argv[1]) result = style.applyStylesheet(doc, None) style.saveResultToFilename(sys.argv[3], result, 0) style.freeStylesheet() doc.freeDoc() 2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto result.freeDoc()
Introduccin a Python
Introduccin a Python
Introduccin a Python
Introduccin a Python
Introduccin a Python
Introduccin a Python
Introduccin a Python
Programacin de GUIs I
Tkinter es la GUI toolkit que por defecto viene con Python (http://www.python.org/doc/current/lib/moduleTkinter.html)
Basada en Tk, que empez siendo una librera para el lenguaje Tcl, y mltiples lenguajes ahora tienen bindings Es lenta pero su uso es muy sencillo
Pythonwin ( http://www.python.org/windows/pythonwin/)
Introduccin a Python
GUIs en Python - I
Introduccin a Python
Tkinter
En Windows, la apariencia no es mala En GNU/Linux no est encima de QT o GTK, sino dirctamente encima de las X, por lo que el resultado deja que desear
Fcil de programar
Introduccin a Python
Ejemplo Tkinter I
# gui/tk/tkinterwatch.py from Tkinter import * import time, sys class StopWatch(Frame): """ Implements a stop watch frame widget. """ def __init__(self, parent=None, **kw): Frame.__init__(self, parent, kw) self._start = 0.0 self._elapsedtime = 0.0 self._running = 0 self.timestr = StringVar() self.makeWidgets() def makeWidgets(self): """ Make the time label. """ l = Label(self, textvariable=self.timestr) self._setTime(self._elapsedtime) l.pack(fill=X, expand=NO, pady=2, padx=2) def _update(self): """ Update the label with elapsed time. """ self._elapsedtime = time.time() - self._start self._setTime(self._elapsedtime) self._timer = self.after(50, self._update) def _setTime(self, elap): """ Set the time string to Minutes:Seconds:Hundreths """ minutes = int(elap/60) seconds = int(elap - minutes*60.0) hseconds = int((elap - minutes*60.0 - seconds)*100) self.timestr.set('%02d:%02d:%02d' % (minutes, seconds, hseconds))
Introduccin a Python
Ejemplo Tkinter II
def Start(self): """ Start the stopwatch, ignore if running. """ if not self._running: self._start = time.time() - self._elapsedtime self._update() self._running = 1 def Stop(self): """ Stop the stopwatch, ignore if stopped. """ if self._running: self.after_cancel(self._timer) self._elapsedtime = time.time() - self._start self._setTime(self._elapsedtime) self._running = 0 def Reset(self): """ Reset the stopwatch. """ self._start = time.time() self._elapsedtime = 0.0 self._setTime(self._elapsedtime) if __name__ == '__main__': root = Tk() sw = StopWatch(root) sw.pack(side=TOP) Button(root, text='Start', command=sw.Start).pack(side=LEFT) Button(root, text='Stop', command=sw.Stop).pack(side=LEFT) Button(root, text='Reset', command=sw.Reset).pack(side=LEFT) Button(root, text='Quit', command=sys.exit(0)).pack(side=LEFT) root.mainloop()
Introduccin a Python
wxPython I
Basado en wxWidgets toolkit Maximiza la portabilidad Windows, UNIX, Mac OS, PocketPC... Look and feel nativo de cada plataforma Podemos crear los widgets grficamente con wxGlade A veces se critica que el que tenga look and live nativo en cada plataforma implica que sea un subconjunto de todas ellas
Introduccin a Python
wxPython II
En wxPython todas las clases estn definidas dentro del mdulo wx Para crear una aplicacin en wxPython hay que crear una clase que deriva de wx.App y sobreescribe el mtodo OnInit Toda aplicacin est formada al menos de un Frame o un Dialog Los marcos pueden contener otros paneles, barras de mens y herramientas (MenuBar y ToolBar ) y lnea de estado (StatusBar)
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
wxPython III
Los marcos y dilogos contienen controles: Button, CheckBox, Choice, ListBox, RadioBox y Slider, ... Existen dilogos predefinidos: MessageDialog o FileDialog A travs del programa wxPython\demo\demo.py se pueden ver demos
Introduccin a Python
Ejemplo wxPython I
#!/usr/bin/env python # gui/wxPythonSemanaESIDE.py __author__ = "Diego Ipia <[email protected]>" import wx class Frame(wx.Frame): """Clase frame que visualiza una imagen.""" def __init__(self, image, parent=None, id=-1, pos=wx.DefaultPosition, title='Hola, semaneros ESIDE!'): """Crea un Frame y visualiza imagen.""" temp = image.ConvertToBitmap() size = temp.GetWidth(), temp.GetHeight() wx.Frame.__init__(self, parent, id, title, pos, size) self.bmp = wx.StaticBitmap(parent=self, id=-1, bitmap=temp)
Introduccin a Python
Ejemplo wxPython II
class App(wx.App): """Clase aplicacin."" def __init__(self): wx.App.__init__(self) def OnInit(self): wx.InitAllImageHandlers() image = wx.Image('semanaeside.jpg', wx.BITMAP_TYPE_JPEG) self.frame = Frame(image) self.frame.Show() self.SetTopWindow(self.frame) return True def main(): app = App() app.MainLoop() if __name__ == '__main__': main()
Introduccin a Python
wxGlade
wxGlade (http://wxglade.sourceforge.net/)
Introduccin a Python
PyGTK
Librera muy completa Herramienta Glade para disear los interfaces de manera grfica
Introduccin a Python
Demo:
pygtk-demo.py
Nos muestra una demo de los controles bsicos, cmo usarlos, y el cdigo correspondiente
Introduccin a Python
Programando en PyGTK - II
Llamar a gtk_init
Despus inicializamos todos los widgets El programa se queda bloqueado en este punto Le llamaremos desde un evento, al terminar el evento saldremos de la funcin gtk_main
e-ghost ESIDE Universidad de Deusto
Llamar a gtk_main
Llamar a gtk_main_quit
Introduccin a Python
Introduccin a Python
Programando en PyGTK - IV
En PyGTK, no hace falta llamar a gtk_init, est implcito al importar gtk El mdulo gtk tiene los mtodos:
gtk.main() gtk.main_loop()
Introduccin a Python
Programando en PyGTK - V
#gui/gtk/gtk1.py import gtk def metodo(*args): print "Entro en gtk.main_quit" gtk.main_quit() print "Salgo de gtk.main_quit" win = gtk.Window() win.connect("delete_event",metodo) win.show() print "Entro en gtk.main" gtk.main() print "Salgo de gtk.main"
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Programando en PyGTK - VI
w = gtk.Window()
Introduccin a Python
gtk.main()
Introduccin a Python
Para aadir varios widgets necesitamos boxes, que agrupan varios widgets:
Ver gtk3.py
Introduccin a Python
Programando en PyGTK - IX
Eventos:
Eventos comunes:
Window: delete_event: Al cerrar ventana Entry: activate: Al pulsar intro en un entry Button: clicked: Al pulsar el botn
Ver gtk4.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Programando en PyGTK - X
Imgenes: gtk.Image
import gtk
gtk.main()
Introduccin a Python
Programando en PyGTK - XI
Utilizando GDK
GDK es el Graphical Development Kit, que nos permitir llevar a cabo muchas ms cosas
Slo hay que echar un vistazo a la documentacin al espacio de nombres GDK para ver la cantidad de posibilidades que nos da
Creando un rea para dibujar: gtk.drawing_area tiene varios eventos heredados de gtk.Widget, como: configure_event: es llamado cuando se modifica el tamao del Widget expose_event: es llamado cuando se tiene que redibujar al menos una parte del widget Ver imagenes/imagenes4.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
El TreeView slo se encarga de lo que es el widget que se ve, no del contenido del mismo Para el contenido, debe utilizar un gtk.TreeModel, como ListStore (para listas) o TreeStore (para rboles)
Ver treeviews/lista.py y treeviews/arbol.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Glade - I
En momentos en los que necesitemos generar dinmicamente widgets Aprender y entender cmo funciona PyGTK Cansar Resultar dificil Aadir cdigo innecesario al programa
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Glade - II
Herramienta interactiva para diseo de GUIs con GTK+ y Gnome Guarda en un .glade (XML) el diseo del interfaz grfico del programa Nuestra aplicacin dinmicamente cargar el .glade y generar los widgets Si queremos acceder a un widget concreto: mi_glade.get_widget(nombre_widget) Adems, permite manejar seales, de manera que podemos asignar a qu funciones se llamar para capturar qu seal:
'hago_click':funcion_hago_click, 'salir':funcion_salir })
mi_glade.signal_autoconnect({
Ver glade/glade1.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
El servidor HTTP Apache es una herramienta software libre tanto para las plataformas UNIX como Windows. Su objetivo es proporcionar un servidor web seguro, eficiente y extensible que provea servicios HTTP acorde con el estndar actual de este protocolo. Apache es desde 1996 el servidor web ms popular. Este servidor es un desarrollo de la Apache Software Foundation.
http://httpd.apache.org/
Introduccin a Python
Instalacin de Apache
La mayora de las distribuciones Linux ya traen preinstalado este servidor bien en su versin 1.3 o 2.0
Nosotros utilizaremos 2.0 Para Windows bajar fichero .msi de http://httpd.apache.org/ Para Linux, utilizar vuestro gestor de paquetes favorito para su instalacin:
Instalacin:
Con yum:
yum install httpd
Introduccin a Python
Instalar Apache 2.0, disponible en: http://httpd.apache.org/download.cgi Instalar mod_python 3: En Ubuntu: apt-get install libapache2-mod-python # a2enmod mod_python La configuracin la modificaremos en /etc/apache2/modsenabled/mod_python.conf Configurar Apache aadiendo a la configuracin las siguientes lneas, para dar soporte a mdulos de Python y PSPs (Python Server Pages): <Directory "<dir-donde-guardar-python-scripts>"> AddHandler python_program .py PythonHandler mod_python.publisher PythonDebug On </Directory> <Directory "<dir-donde-guardar-paginas-psp>"> AddHandler python_program .psp PythonHandler mod_python.psp PythonDebug On </Directory>
Introduccin a Python
Cdigo en Python delimitado por cdigos de escape <% y %>. Expresiones delimitadas por <%= y %>. Directivas, <%@ incluye file=nombre-fichero> Comentarios delimitados por los smbolos <%-- y --%>
Introduccin a Python
req, referencia a un objeto de tipo Request psp, objeto de tipo PSPInstance que permite invocar mtodos como redirect(location) o set_error_page(filename) form, objeto de tipo FieldStorage session, objeto de tipo Session
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ejemplo PSP
<! /web/psp/login.psp --> <% import tresenrayaweb import RegistroJugadoresDB if not session.has_key('registro'): session['registro'] = RegistroJugadoresDB.RegistroJugadoresDB() mensajeError = "" if form.has_key('nombreUsuario') and form.has_key('clave'): try: session['registro'].login(form['nombreUsuario'], form['clave']) psp.redirect('/web/psp/tresenraya.psp?nombreUsuario=' + form['nombreUsuario']) except: mensajeError = 'Los detalles de login introducidos son incorrectos' saludo = 'Introduce tus detalles de logeo para jugar al Tres en Raya' # end %> <html> <h1><%= saludo %></h1> <form method="post" action="/web/psp/login.psp"> <table> <tr><td>Nombre usuario:</td><td><input type="text" name="nombreUsuario"></td></tr> <tr><td>Contrasea:</td><td><input type="password" name="clave"></td></tr> <tr><td><input type="submit" value="Login"></td><td><input type="reset" name="Limpiar"></td></tr> </table> </form> <% if len(mensajeError): %> <p><%=mensajeError%></p> <% # end if %> Ordua e-ghost ESIDE Universidad de </html>
2007 Pablo
Deusto
Introduccin a Python
Ejemplo Python
import MySQLdb, string, _mysql, _mysql_exceptions, tresenraya class RegistroJugadoresDB(tresenraya.RegistroJugadores): def __init__(self): tresenraya.RegistroJugadores.__init__(self) db=MySQLdb.connect(host="localhost",user="tresenraya", passwd="tresenraya", db="tresenraya") self.cursor = db.cursor() # Asegurarse que si no existe un usuario solop se aada usuarioSolop = self._executeSQLCommand("select * from usuario where nombreUsuario='solop'") if not len(usuarioSolop): self._executeSQLCommand("insert into usuario values('solop', 'solop')") self._executeSQLCommand("insert into estadistica values('solop', 0, 0, 0)") print 'Usuario solop y sus estadisticas creadas' else: usuarios = self._executeSQLCommand("select * from usuario") for usuario in usuarios: self._RegistroJugadores__jugadores[usuario[0]] = usuario[1] # recuperamos las estadsticas de partidas de un jugador estadisticasUsuario = self._executeSQLCommand("select ganadas, empatadas, perdidas from estadistica where nombreUsuario='" + usuario[0] + "'") self._RegistroJugadores__estadisticas[usuario[0]] = [int(estadisticasUsuario[0][0]), int(estadisticasUsuario[0][1]), int(estadisticasUsuario[0][2])]
Introduccin a Python
Ejemplo Python
def _executeSQLCommand(self, command): # si la consulta devuelve resultados lo har como una lista de tuplas, donde cada tupla # representa una fila de la tabla correspondiente, y cada elemento de la tupla una columna resultado = [] command = string.strip(command) if len(command): try: resultCode = self.cursor.execute(command) # Ejecuta el comando if string.lower(command).startswith('select'): # si es una select ... filas = self.cursor.fetchall() # recuperar todos los resultados for fila in filas: contenidoFila = [] for columna in fila: if columna == None: contenidoFila.append(None) else: contenidoFila.append(columna) resultado.append(tuple(contenidoFila)) except _mysql_exceptions.ProgrammingError, e: print e sys.exit() return resultado # sigue ms cdigo
Introduccin a Python
SOA
Los servicios web han dado lugar a un nuevo modo de disear sistemas distribudos:
http://msdn.microsoft.com/Longhorn/understand library/en-us/dnbda/html/srorientwp.asp
Introduccin a Python
Servicios Web
http://www.w3.org/TR/SOAP
No necesitas ni Windows ni .NET, ni UNIX ni Java para escribir servicios web Servicio web = aplicacin que:
se ejecuta en un servidor web expone mtodos a clientes escucha peticiones HTTP representando comandos que invocan a mtodos Web ejecuta mtodos web y devuelve resultados
Introduccin a Python
SOAP
SOAP es un protocolo de comunicacin basado en XML til para la comunicacin entre aplicaciones
http://www.w3.org/2000/xp/Group/
SOAP es reconocido como el backbone de una nueva generacin de aplicaciones multi-platforma y multi-lenguaje, denominado Servicios Web. SOAP es un mecanismo para el intercambio de mensajes a travs de Internet independiente de los lenguajes de programacin
Es un protocolo de transporte
Los clientes envan una peticin SOAP mediante un HTTP POST normalmente y reciben un cdigo de respuesta (xito o error) y una respuesta SOAP Un mensaje SOAP es un mensaje XML que consta de un conjunto de cabeceras opcionales y de un cuerpo.
Introduccin a Python
Peticin SOAP
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/s oap/envelope/"> <soap:Body> <getProductDetails xmlns="http://warehouse.example.com/ws"> <productId>827635</productId> </getProductDetails> </soap:Body> </soap:Envelope>
Introduccin a Python
Respuesta SOAP
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getProductDetailsResponse xmlns="http://warehouse.example.com/ws"> <getProductDetailsResult> <productName>Toptimate 3-Piece Set</productName> <productId>827635</productId> <description>3-Piece luggage set. Black Polyester.</description> <price>96.50</price> <inStock>true</inStock> </getProductDetailsResult> </getProductDetailsResponse> </soap:Body> </soap:Envelope>
Introduccin a Python
http://www-106.ibm.com/developerworks/l
Introduccin a Python
Hacer doble clic sobre PyXML-0.8.4.win32-py2.4.exe Ofrece soporte para valores especiales Not-a-Number (NaN), Positive Infinity (Inf), y Negative Infinity (-Inf), parte de la especificacin SOAP Extraer fpconst-0.7.2.zip cd <directorio-donde-se-ha-extraido-fpconst-0.7.2.zip> Python setup.py install Extraer fichero SOAPpy-0.12.0.zip cd SOAPpy-0.12.0 python setup.py build python setup.py install
SOAPpy, http://pywebsvcs.sourceforge.net/
Introduccin a Python
Introduccin a Python
Introduccin a Python
Explicacin SOAPpy
El objeto SOAProxy maneja todos los detalles internos del uso de SOAP Crea un intermediario (proxy) entre nosotros y el servicio web final
Podemos utilizar las propiedades dumpSOAPIn y dumpSOAPOut para ver el contenido de las peticiones y respuestas SOAP
Introduccin a Python
Introduccin a Python
WSDL
La URL y espacio de nombres del servicio El tipo de servicio web La lista de funciones disponibles Los argumentos de estas funciones Los tipos de datos de cada argumento Los valores de retorno de cada funcin y sus tipos
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Introduccin a Python
Ms sobre el lenguaje
Casi todo lo visto hasta ahora han sido APIs y ms APIs que a veces poco tienen que ver con Python y hay que buscar documentacin en MySQL, W3C, GTK, etc. En lo que queda nos centraremos en otras caractersticas que no hemos visto del lenguaje
En esta parte hay explicaciones que estn slo en los ejemplos (no cabe en las transpas), y viceversa: ten a mano los ejemplos ;-)
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Documentacin en Python - I
def funcion():
Estos comentarios slo los ve el que lea el cdigo No se guarda en los .pyc (al hacer import
nombre_modulo, se genera el .pyc)
Introduccin a Python
Documentacin en Python - II
Para documentar funciones, hay que poner un string justo debajo del paquete, mdulo, clase o funcin
funcion() -> float Devuelve un nmero aleatorio entre 0 y 1 import random return random.random()
def mirandom():
Introduccin a Python
Ver /doc/
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Filtros
>>> palabra = hola >>> print ''.join([2*i for i in palabra]) hhoollaa >>> [2*i for i in range(10) if i % 2 == 0] [0,4,8,12,16]
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Funciones especiales - I
Punteros a funcin
>>> def f(): ... >>> puntero = f >>> puntero() hola mundo >>> def f2(funcion): ... funcion() >>> f2(puntero) hola mundo
Introduccin a Python
Funciones especiales - II
Punteros a mtodos
def __init__(self,nombre): self.nombre = nombre def f(self): print "hola, soy",self.nombre
class A:
#puntero es un puntero al mtodo, no es llamable sin ms #para utilizarlo, le tenemos que pasar una instancia #Le llama pasndole como self, a #De hecho, puntero es un unbound method de A
#Si quisieramos un mtodo de A bounded a una instancia, tendramos que hacer esto: otro_puntero = a.f print otro_puntero otro_puntero() #f de la instancia, no de la clase #Este s es un bound method #Y este s es llamable
Introduccin a Python
Lambda
tiles, por ejemplo, para eventos Parmetros como siempre (*args, **kargs) No permiten ms que una expresin
>>> def decir_un_numero(numero): ... print Voy a hacer algo en funcin del nmero,numero
Introduccin a Python
Yield
... ... ... ... >>> for i in f(['a','b','c']): ... ... Voy a devolver a Me ha devuelto a Voy a devolver b Me ha devuelto b Voy a devolver c Me ha devuelto c print Me ha devuelto,i
Ver avanz/funciones/yield.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Sobrecarga de operaciones - I
Las clases en Python tienen una serie de mtodos especiales que les sirve para diferentes tareas: (avanz/clases/operadores.py)
__init__ : constructor de clase __str__ : similar al toString de Java o ToString de Mono/.NET __doc__ : la documentacin que guardamos poniendo un string debajo de la funcin/mdulo/etc. __gt__, __eq__, __lt__: se invocan cuando alguien llama a instancia < otra (o =, o >...) __add__, ...: otros operadores (+, -...)
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ocultamiento de informacin
>>> class A:
Como regla de estilo, se pone _ por delante de la variable Es igual que poner el atributo sin ms, pero como regla de estilo, si pones _ por delante al acceder a una instancia, es que no deberas
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ocultamiento de informacin
Sigue siendo accesible Si accedes a instancia._NombreClase__dato, seguro que sabes lo que ests haciendo Afecta a las clases hijas (tampoco pueden acceder dirctamente) (Name mangling)
avanz/clases/ocultamiento1.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ocultamiento de informacin
Gracias a ello es posible la serializacin de datos privados ya sea para BD o XML, por ejemplo Ejemplos en /avanz/clases/accediendo_privado_en_otro s_lenguajes
Introduccin a Python
Ocultamiento de informacin
__getattr__: En caso de que se intente acceder a un campo / funcin de una instancia y el campo / funcin no exista, se llama a esta funcin:
Ejemplo en /avanz/clases/ocultamiento2.py
Introduccin a Python
Ocultamiento de informacin
object:
__getattribute__(self,nombre): se le llama cuando alguien intenta acceder a cualquier cosa, incluso si existe __setattr(self,nombre,valor): se le llama cuando alguien intenta modificar cualquier cosa, incluso si existe
(object internamente implica bastantes ms cosas que no vamos a ver en el cursillo) Ver avanz/clases/ocultamiento3.py
Introduccin a Python
Herencia mltiple
Python permite a una clase heredar de ms de una clase a la vez Un problema clsico de este tipo de herencia es el problema del diamante:
metodo(){}
clase A{ } clase B{ metodo(){} } clase C hija de clases A y B{} c = instancia de C() c.metodo() #A quin llama?
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Herencia mltiple
En C# y Java se evita
no permitiendo que una clase herede de ms de una clase soportando su funcionalidad mediante interfaces
Introduccin a Python
Herencia mltiple
La solucin pasa por llevar una bsqueda en profundidad sobre las clases de las que hereda
Introduccin a Python
Herencia mltiple
En el caso visto, si se llama al mtodo metodo de la clase E, se buscar primero en C, que buscar en B, que buscar en A. Si no se encuentra, se buscar en D Por tanto, no siempre es igual:
class E(C,D)
que:
class E(D,C) avanz/clases/herencia_multiple.py
2007 Pablo Ordua e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Recoleccin de basura
Jython, IronPython utilizarn los GC de Java, Mono/.NET, etc. Nos centraremos en el recolector de basura de CPython
Por cada instancia, hay un contador de cuntas referencias hay a la instancia Si el nmero de referencias llega a 0, la instancia es eliminada
Introduccin a Python
Recoleccin de basura
Cuando una instancia es eliminada, se llama a su mtodo __del__ Podemos eliminar una variable con del
IMPORTANTE: avanz/gc/referencias1.py
def __del__(self): print Me muero!
>>> class A: ... ... ... >>> a = A() #a apunta a una instancia de A >>> a = 5 Me muero! >>> a = A() #a apunta a otra instancia de A >>> del a Me muero! #Eliminamos a. Ya no existe la referencia: la instancia se muere #Ahora a apunta a otro lado: la instancia no es referenciada y se elimina
Introduccin a Python
Recoleccin de basura
Cuidado
Slo elimina una variable, si otra variable est referenciando a la misma instancia, la instancia no ser destruida Si una instancia apunta a otra, y es apuntada por la misma, los contadores de ambas instancias nunca llegarn a 0
avanz/gc/referencias2.py
Introduccin a Python
Recoleccin de basura
Cuidado
__del__
Al igual que el finalize Java, nadie puede asegurar cundo __del__ ser invocado, ni siquiera si ser o no invocado No debe ser utilizado para la liberacin de recursos
Normalmente, no son un problema En los casos en los que s lo sean, se pueden utilizar weakrefs: avanz/gc/referencias3.py
Introduccin a Python
Reflection en Python
Podremos, dada una clase, desconocida cuando programamos, ver qu mtodos tiene, dada una instancia, invocarlos dinmicamente, etc. etc. Podremos incluso realizar modificaciones:
Aadir / eliminar funciones dinmicamente Cambiar tipos de datos Generar clases dinmicamente ...
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Reflection en Python
Lista los atributos, funciones, etc. que haya en el mdulo / clase / etc. Obtiene algo.(valor de nombre), siendo nombre un string Devuelve si algo tiene un nombre
e-ghost ESIDE Universidad de Deusto
getattr(algo,nombre)
hasattr(algo,nombre)
avanz/reflection/reflection1.py
Introduccin a Python
Reflection en Python
setattr(algo,nombre,valor)
asignamos valor a la variable nombre de algo Si nombre no existe, lo crea borramos la variable nombre de algo
delattr(algo,nombre)
avanz/reflection/reflection2.py
Introduccin a Python
Reflection en Python
__dict__
Toda clase, mdulo, instancia... tienen este objeto, y por defecto es modificable En l, se guardan las variables internas, asociadas a un nombre En el __dict__ de una instancia, se guardan las variables de la instancia, mientras que en el __dict__ de la clase, los mtodos y variables globales
avanz/reflection/reflection3.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Reflection en Python
Como estamos viendo, podremos ver y modificar dinmicamente nuestras estructuras fcilmente
Como decamos antes, esto puede ser til para obtener informacin de un mdulo que no conozcamos mientras programamos (para serializarlo, por ejemplo) Podemos crear clases dinmicamente que tengan diferentes comportamientos segn unos parmetros, y que todas las instancias de esta clase tengan esos comportamientos, manteniendo integridad Un largo etc.
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Avanzando en Python
Incluso al mdulo actual De hecho, las variables, funciones, clases locales no son ms que claves del __dict__ del mdulo actual
locals(), globals()
avanz/avanzando/avanzando1.py
S: avanz/avanzando/avanzando2.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Ms propiedades dinmicas
eval
Debe ser una expresin, una declaracin de clase no la ejecuta, por ejemplo
exec
avanz/avanzando/avanzando5.py
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Podemos metaprogramar: podemos programar la generacin de cdigo dinmicamente para determinadas circunstancias En ocasiones, especialmente aquellas en las que se programa de manera relativamente mecnica, nos puede ayudar mucho Sin embargo, tambin trae problemas
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Problemas
Ilegibilidad
al usar estas propiedades, el cdigo se vuelve ms complejo, ms difcil de leer, entender y mantener debemos validar todava ms la entrada de informacin, ya que si un atacante consigue inyectar cdigo, nos est inyectando cdigo Python dirctamente
Seguridad
Introduccin a Python
Problemas
Seguridad
Por ejemplo, en el caso del tres en raya, la lectura de teclado haca esto: Si el usuario escribe algo tal que:
s = raw_input("Escribe ...: ") casillaCoords = eval(s) # interpreta la entrada como una tupla
Es una expresin correcta, que devuelve una tupla vlida (1,1), que es interpretada como una casilla, pero que, adems, ha descargado y ejecutado un programa
e-ghost ESIDE Universidad de Deusto
Introduccin a Python
Casos de xito
BitTorrent, sistema P2P ZOPE (www.zope.org), servidor de aplicaciones para construir y gestionar contenido, intranets, portales y aplicaciones propietarias Industrial Light & Magic usa Python en el proceso de produccin de grficos por ordenador GNU Mailman, el popular gestor de listas de correo electrnico est escrito en Python Google usa internamente Python, lo mismo que Yahoo Diversas distribuciones de GNU/Linux utilizan Python para configuracin, gestin de paquetes, etc.
Introduccin a Python
Referencias
http://paginaspersonales.deusto.es/dipina/
http://vig.prenhall.com/catalog/academic/product/1,4096,0130409561,00
http://www.oreilly.com/catalog/python2/
http://www.oreilly.com/catalog/jythoness/
Documentacin de Python:
http://docs.python.org