4. Python
• Creado en 1991 por Guido van Rossum
• Multiparadigma: Imperativo, Funcional y
Orientado a Objetos
• Tipado dinámico y fuerte
• Interpretado
• Multiplataforma
• Influencias
• Java, Haskell, Lisp, Perl
Guido van Rossum
Fuente: http://commons.wikimedia.org/wiki/File:Guido_van_Rossum_OSCON_2006.jpg
Python is a programming language that lets you work quickly
and integrate systems more effectively – Python.org
6. Ecosistema II
• Intérprete interactivo: python
• Gestión de paquetes
• pip (https://pypi.python.org/pypi)
• Documentación: https://www.python.org/doc/
• Entorno desarrollo
• Extensión Eclipse: Aptana
• PyCharm de JetBrains
7. Usado por … I
• Youtube
• Sitio web: rapidez de siti oy de desarrollo
• Industrial Light & Magic
• Procesamiento de Star Wars Episodio II (renderizado)
• Otras aplicaciones
• Google
• Sitio web desde los inicios
• Journyx
• Sitio web más rápido que sus competidores
• Desarrollan 10 veces más rápido que en Java y 100 que en C
• IronPort
• Productos de seguridad y servicios para empresas
• Más de 1 millón de líneas de Python
• EVE Online
• Juego multijugador masivo (MMORPG)
• Más de 50.000 jugadores simultáneos
• Rapidez de desarrollo de todo el juego y su flexibilidad
8. Usado por … II
• HomeGain
• Búsqueda de casas
• Mejora continua rápida
• Conciso, sintaxis clara y poderosa biblioteca
• Thawte Consulting
• Autoridad certificadora (5ª del mundo) de certificados
• Productivo y gran mantenimiento de código
• University of Maryland
• Estudiantes de Web Semántica
• Flexibilidad y el gran número de bibliotecas
• EZTrip.com
• Agencia de viajes
• Rápido desarrollo desde que lo incorporaron (días y no meses)
• RealEstateAgent.com
• Agencias de casas (venta, alquiler, …)
• Aplicaciones rápidas y compenentes con recursos mínimos
• Es un lenguaje crítico para ellos en su clúster
• Firaxis Games
• Empresa de videojuegos (Civilization, XCOM)
• Herramienta de mods, pantallas de juego, interfaces, …
• Lenguaje de Scripting, recolector de basura, desarrollo más rápido que en C++, ..
9. Python 3 vs Python 2
• “Python 2.x is legacy, Python 3.x is the present and future of the
language” - Python.org
• Python 2
• Ya no recibe actualizaciones mayores
• Muchos problemas con las codificaciones
• Muchas librerías creadas en Python 2 y sin portar a Python 3
• Herramienta para ayudar a portar el código: 2to3
(https://wiki.python.org/moin/2to3)
• Python 3
• Ofrece un soporte correcto a las codificaciones. Por defecto, todo es
Unicode (UTF-8)
• No es retro-compatible
• Cambios en algunas funciones/clases
• Más eficiente con la memoria
• Aún no están todas las librerías portadas
• Mejoras en el Core (funciones, librerías, rendimiento, excepciones, …)
• Herramienta para ayudar a portar el código: 3to2
(https://wiki.python.org/moin/3to2)
17. Instalación VII
• Abrimos un nuevo terminal o lo reiniciamos
• Comprobamos que tenemos Python
• Comando: python
• Muestra la versión de Python
• Abre el Intérprete Interactivo
18. Instalación VIII
• Abrimos el CMD
• Miramos los paquetes instalado
• pip freeze
• Esta vacío pues no instalamos ningún
paquete
• Para instalar un paquete
• pip install nombreDelPaquete
20. Pruebas Unitarias I
• Unittest
• Antiguo PyUnit
• Similar a xUnit: JUnit, PHPUnit,…
• Flujo de trabajo
• Importar “unittest”
• Crear una clase que herede de
“unittest.TextCase”
• Crear funciones que comiencen por “test_”
• Ejecutar las pruebas utilizando unittest.main()
21. Pruebas Unitarias II
• Métodos autollamados
• setUp(self): Antes de ejecutarse un test
• tearDown(self): Después de ejecutarse un test
• Métodos disponibles
• assertEqual, assertRaises, assertFalse, assertTrue,
assertDictEqual, assertIsInstance, asserIsNone, …
• __main___
• Variable que se crea cuando se ejecuta el módulo
como programa principal. Con el “if”, se evita
que se ejecute ese código si se importa en otro
25. Conceptos básicos
• Lenguaje Multiparadigma
• Imperativo, Funcional y Orientado a Objetos
• Todo son Objetos
• No hay tipos primitivos
• Esto proporciona que todo tenga métodos
26. Tipado dinámico
• No se declara el tipo de la variable
• La variable puede tomar diferente tipo en
distintos momentos
• Permite mayor flexibilidad
• Chequeo de tipos en tiempos de ejecución
• Errores en tiempo de ejecución
http://stackoverflow.com/questions/125367/dynamic-type-languages-versus-static-type-languages
http://www.smashingmagazine.com/2013/04/18/introduction-to-programming-type-systems/
27. Fuertemente Tipado
• Permite algunas operaciones entre
parámetros de tipo similar (numérico)
• Int con Float, Int con Complex, …
• No permite operaciones entre números y
cadenas
29. Sintaxis básica
• ; - Opcional, salvo si hay varias sentencias en la misma línea
• () - Opcionales en las estructuras de control
• Requiere identación obligatoria
• 4 espacios (recomendado) ó 1 tabulador
• Mismo tipo de identación elegida en todo el documento
• Los IDEs lo suelen automatizar
• Comentario #:
• # Esto es un comentario de una línea
• Antes de la almohadilla hay que dejar dos espacios y detrás uno: 2*espacios#espacio
• Comentario multilínea
• “““ Comentario multilinea ”””
• Nombrado
• Funciones: snake_case (nombre_de_la_funcion_o_variable) y empieza por minúscula
• Variables: snake_case (nombre_de_la_funcion_o_variable)
• Clases: CamelCase (NombreDeLaClase) y empieza por mayúscula
• Booleanos: “False” y “True”
• Negación: “not”. Es similar al “!” de otros lenguajes
• El valor nulo es “nil” en vez de null
• Algo sin valor es “None”
31. Condicional - if
• if…elif…elif[…else]
• elif = else if
• else: opcional
• Si no existe y debiera entrar, el programa continua sin
realizar ninguna acción
32. Bucle – for
• Es diferente al bucle clásico
• Itera sobre los elementos de secuencias
(listas, cadenas, …) siguiendo el orden
33. Range
• Función que permite iterar sobre una
secuencia de números
• Genera progresiones aritméticas
34. break, continue
• break
• Igual que en C y Java
• Rompe el bucle
• continue
• Igual que en C y Java
• Salta a la inmediatamente a la siguiente iteración
35. else
• Los bucles “for” pueden incorporar la
sentencia “else”
• Se ejecuta
• Cuando termina de iterar
• Cuando hay un “continue”
• No se ejecuta
• Cuando termina con un “break”
36. pass statements
• Esta sentencia no hace nada
• Se utiliza cuando se requiere una declaración
sintáctica pero en la que aun no queremos
realizar ninguna acción o rellenar
37. Ejercicio: Par - Factorial
• https://gist.github.com/gonzalezgarciacristian
/bd448626508198c83645
• even(n): chequea que un nº es par
• Devuelve True/False
• factorial(n): calcula el factorial de un nº
• No utilizar la librería math
• Devuelve el factorial
39. Funciones I
• Se utiliza la palabra reservada “def”
• Debe haber dos líneas de separación entre funciones
• La primera línea puede ser la descripción
• Utilizada por herramientas de documentación
• Pasa los valores por
copia, como en Java
40. Funciones II
• Permite guardar funciones en variables
• Sirve para crear alias de la función
• Las funciones retornan “None”
• Por convenio
• Si no tienen retorno
• Si la función termina antes de
llegar al retorno
41. Parámetros por defecto I
• Se pueden crear parámetros con valores por
defecto
• Si se asigna un parámetro por defecto, han de
asignarse los siguientes (Definición y llamada)
42. Parámetros por defecto II
• El valor por defecto, en caso de
coincidir, lo coge de la variable global
en dicho punto de la ejecución,
aunque después cambie
• Si el valor por defecto es mutable, en
el caso de listas, diccionarios o clases,
este se acumulará
• Para evitar esto hay que utilizar
“None”
43. Keyword Argument
• Se pueden pasar los parámetros a las
funciones utilizando el nombre del parámetro
• Permite utilizar algunos valores por defecto
• Si los utilizamos, deberemos especificar todas
las que no vayan en orden
44. Arbitrary Argument Lists
• Como parámetro, generalmente el final, se
puede crear una lista de argumentos
arbitrarios
• Esta lista envuelve en una tupla todos los
argumentos restantes pasados a la función
45. Unpacking Argument Lists
• Permite enviar elementos en tuplas, listas y
diccionarios
• Estos pueden ser automáticamente procesados,
pero hay que especificarlo
• *arg: lista o tupla
• **arg: diccionario
46. Lambda Expressions
• Azúcar sintáctico de una función normal
• Se crean utilizando la palabra reservada “lambda”
• También conocidas como funciones anónimas, clausuras o
funciones Lambda
• Sirven para ser pasadas como argumento o devolver el
resultado de una función sencilla sin necesidad de definirlas
completamente
47. Documentación
• Existe una convención para la documentación
• 1ª línea debe ser un resumen corto
• Comienza en mayúscula y termina en punto
• 2ª línea debe ser una línea en blanco
• 3ª en adelante: Información
49. Listas I
• Se instancian vacías con: []
• Se pueden instanciar con datos: [3, 4, 5]
• Métodos
• append(x), extend(list), insert(i, x), remove(x),
pop([i]), clear(), index(x), count(x), sort(),
reverse(), copy()
• Insert, remove y sort devuelven “None”
• Principio de diseño para todas las estructuras
mutables en Python
50. Listas II - Pilas
• Último en entrar, primero en salir
• Usando los métodos
• append(x): añadir elemento
• pop(): sacar último elemento
51. Listas III - Colas
• Primero en entrar, primero en salir
• Las listas no son eficientes para esto
• Añadir y sacar del final es rápido
• Añadir y sacar del principio es lento: tiene que
mover todos los elementos uno a uno
• Hay que utilizar collections.deque
52. Listas IV – Comprehensions
• Azúcar sintáctico para crear listas
• Crear listas donde cada miembro es el
resultado de una condición
• Consiste en una expresión seguida de una
cláusula
53. Ejercicio: Números primos
• https://gist.github.com/gonzalezgarciacristian/0
023aeb4e3b98edc5a2d
• is_prime(n): dice si un número es primo o no
• Devuelve True/False
• obtain_prime_factors(n): calcula los factores
primos de n
• Devuelve una lista con los factores primos
• n = 0 -> []
• n = 1 -> [1]
• n > 1 -> [1, …]
54. Del statement
• Sentencia que permite
• Borrar uno o más elementos de una lista
• Borrar toda la lista
• No devuelve el valor, algo que si hace .pop([i])
55. Tuplas I
• Valores separados por coma (,)
• (1, 2); (3, ‘a’); ([4, 5], “Hello”, 5); …
• Puedes anidarse (contener tuplas)
• Son inmutables (no se pueden modificar una vez
creadas)
• Pueden contener múltiples objetos
56. Tuplas II
• Pueden contener elementos mutables, como listas
• Se instancian
• Tupla vacía: ()
• Tupla 1 o más elementos separados por: ,
• Para desempaquetar una tupla, hay que asignar
tantas variables como posee. Si no, error
57. Sets I
• Colección de elementos no duplicados desordenados
• Se instancian con
• Vacío: set()
• Con un solo elemento iterable (strings, listas, …): set(x)
• Con elementos: {x, y, z}
59. Diccionarios I
• En otros lenguajes son similares a los “associative
memories”, “associative arrays” o “hash table”
• Son un set desordenado compuesto por clave-valor
• Indexan usando las claves (“keys”)
• Elementos inmutables: Números, strings o tuplas
• Tuplas: sólo si contienen números, strings o tuplas
• Las claves son únicas
• Se instancian con
• Vacío: {}
• Datos: {clave: valor} -> {‘Lerdorf’: 2, ‘Matsumoto’: 3}
60. Diccionarios II
• Los datos se extraen a partir de su clave
• Si no existe la clave, excepción “KeyError”
• Borrado de datos utilizando “del” y su clave
• Si se almacena sobre una clave existente, se
sobrescribe el valor
61. Diccionarios III
• Utilidades
• .keys(): devuelve una tupla con las claves
• list(dicc.keys()): obtenemos una lista con las
claves desordenadas
• sorted(list(dicc.keys())): obtenemos una lista
ordenada de las claves
• x in dicc: comprueba que x existe en dicc
62. Diccionarios IV
• Otras formas de crearlos
• Secuencias clave-valor
• “Comprehensions”
• “Keyword arguments”
65. Módulos I
• Archivo que contienen definiciones y sentencias
de Python
• Permiten
• Dividir el código en varios archivos
• Reutilizar código
• Organizar las funciones
• El nombre del módulo es el nombre del archivo +
.py
• Se importa con la sentencia import
• Se puede obtener el nombre del módulo con el
método: __name__
66. Módulos II
• Hay dos formas de importarlos
• import “moduleName”
• Menos sentencias “import”, pues trae todo el módulo
• Hay que escribir el nombre del módulo delante para
acceder a él
• from “moduleName” import “functionality”
• No hay que escribir el nombre del módulo delante de
la funcionalidad
• Mayor control sobre lo que se carga de cada módulo
• Para nuevas funcionalidades que se usen, hay que
actualizar los “import”
• Menos verboso y menos legibilidad
70. Ficheros I
• open(filename, mode)
• retorna un objeto de tipo “file”
• filename: nombre del fichero
• mode: modo de apertura
• Se pueden juntar: r+, w+, a+, rb, wb, …
Modo Significado
'r' Lectura (por defecto)
'w' Escritura desde el principio del fichero
'x' Abrir creando el fichero, falla si ya existe
'a' Escritura desde el final del fichero
'b' Modo binario
't' Modo texto (por defecto)
'+' Lectura y escritura
'U' (Obsoleto)
71. Ficheros II - Escritura
• Se utiliza el método open(filename, mode)
• mode
• w: escritura desde principio del fichero
• w+: escritura y lectura desde principio del fichero
• a: escritura desde final del fichero
• a+: escritura y lectura desde final del fichero
• .write(string): graba en el fichero
• Otros tipos de datos hay que convertirlos a string
72. Ficheros III – Lectura I
• Se utiliza el método open(filename, mode)
• mode
• r: lectura del fichero
• r+: lectura y escritura
• rb: lectura del fichero en modo binario
• rb+: lectura y escritura en modo binario
• .read(): lee todo el fichero
• .readline(): lee las líneas de una en una
73. Ficheros III – Lectura II
• .readlines() / list(fileObject): devuelve una
lista con todas las líneas
74. Ficheros IV – Otros métodos
• .tell(): posición del puntero representado
como el nº de bytes
• .seek(offset, from_what): cambia la posición
del puntero
• offset: nueva posición
• from_what: desde donde se calcula
• 0: Principio; 1: Posición actual; 2: Final de fichero
• .close(): cierra el fichero
75. Ficheros V – Otros I
• with: palabra clave para abrir los ficheros y
que se encarga de cerrarlo al terminar
aunque haya un error
• .closed: booleano que indica si esta cerrado el
fichero
76. JSON - Escritura
• Hay que importar la librería JSON
• .dump(x, file): graba al fichero los datos x
JSON Python
object dict
array list
string unicode
number (int) int, long
number (real) float
true True
false False
null None
• Tabla de equivalencias ->
77. JSON – Lectura
• .load(file): deserializa el documento
• file: fichero ya abierto para lectura
• .dumps(data, sort_keys, indent): muestra
en formato JSON los datos. Tiene más
parámetros
• data: datos
• sort_keys: ordenar salida por clave
• indent: indenta el código tantos espacios
como se indique
79. Syntax Errors
• Errores comunes cuando se programa
• Sintaxis incompleta o incorrecta
• Un IDE ayuda con estos errores
80. Exceptions I
• La sintaxis es correcta pero falla algo
• Son errores en tiempo de ejecución
• Pueden romper el programa si no se tratan
• Jerarquía de excepciones:
https://docs.python.org/3/library/exceptions.
html
• Se pueden definir excepciones propias
81. Exceptions II
• Para tratar excepciones debemos usa rla
cláusula “try-except”
• El contenido de “try” será ejecutado
• Si el “try” falla, se ejecuta inmediatamente el
“except”, obviando el resto del “try”
• Si el “try” no falla, se ejecuta entero y no se
ejecuta el “except”
82. Exceptions III
• En el “except” se ejecuta la cláusula que
coincida con el tipo de excepción lanzada en
el “try”
• Si en el “except” no se encuentra una cláusula
válida, el programa fallará
• Ctrl-C finaliza la ejecución y es una excepción
de tipo “KeyboardInterrupt”
83. Exceptions III
• “except” puede soportar varios tipos de error a la vez
• Puede tener un valor asociado
• “except:” reenvia la excepción a otro nivel
• Cuidado, puede enmascarar errores
• Se puede utilizar para errores personalizados
84. Exceptions IV
• “try-except” soporta opcionalmente la
clausula “else”
• “else” se ejecutará siempre que se ejecute el
“try” al completo
85. Exceptions V
• El valor asociado a una excepción es un
objeto
• Este tiene distintas propiedades
• Tipo de error
• Argumentos
• Dependen del tipo de excepción
• Son una tupla
87. Paquetes I
• Forma de estructurar los módulos
• Permite agrupar los módulos por
funcionalidades similares
• Ayuda a evitar colisiones entre diferentes
módulos (variables, nombres, …)
• Contienen un archivo __init__.py
• No confundir con los directorios
88. Paquetes II
• Se accede utilizando el “.”
• packageA.moduleB: Módulo “moduleB” del
paquete “packageA”
• Desde Python 3 se recomienda, aunque funciona
sin utilizarlo
89. Paquetes III
• __init__.py
• Convierte un directorio en un paquete
• Evita así que un directorio oculte un paquete o
fichero .py debido al nombre
• Por defecto estará vacío
• Puede contener “imports” que se aplicarán a sus
módulos
• Ayuda en su simplifación
• No se recomienda por que peude tener efectos
secundarios
• Es usado por los frameworks para cargar módulos
que necesitan de una manera fácil para el
desarrollador
91. Características
• Todo hereda de Object
• En Python 3 no hace falta especificarlo, en Python 2 si
• Son objetos
• Se pueden renombrar, importar,…
• Se utiliza “self” como acceso a todo (métodos y funciones)
• Tienen herencia múltiple
• Se crean en tiempo de ejecución
• Se pueden modificar en tiempo de ejecución
• Por defecto
• Todo es público, no existe encapsulación
• Las funciones son virtuales (sobrescribibles por polimorfismo
en sus clases derivadas)
• Hay sobrecarga de operadores (__add__, __mul__, …)
92. Clases I
• Definición: “class nombre:”
• Esto crea la definición de un “namespace”
• Soportan dos operaciones
• Referencia de atributos: acceso a sus métodos y
variables utilizando el operador “.”
• Instanciación de la clase: crea un objeto de ese tipo
93. Clases II
• Por defecto, tienen un constructor vacío
• Al instanciarlas, se auto llama al método
__init__(self)
• Para crear uno, debemos de sobrescribir el
método __init__(self)
• Solo pueden tener un constructor
94. Clases III
• Si queremos tener “varios
constructores”, hay que
utilizar
• Parámetros por defecto
• None: para evitar problemas
con objetos mutables (listas,
diccionarios, clases)
• Keyword arguments
95. Data Attributes
• No hace falta declarar las variables de clase
• Estas se crean la primera vez que se utilizan
• Pero a nivel de instancia, no de clase
• Pueden ser borrados con “del”
96. Métodos
• Son funciones que pertenecen a un objeto
• Siempre reciben el propio objeto como
primer argumento (self)
• Se llama “self” por convención
• Los métodos son almacenables en variables
97. Class and Instance Variables I
• Instance variable: variable compartida por
esa instancia
• Class variable: variable compartida por todas
las instancias. Son modificables. Se autocrean
98. Class and Instance Variables II
• Instance variable
• Cuidado con los objetos mutables (listas y diccionarios)
• Estos se comportarían como una variable estática
• Es accesible para todas las instancias
100. Herencia I
• Se pasa la clase padre entre paréntesis
• Estas pueden estar en otros módulos
• Importarlo
• Referenciarlo (depende del tipo de “import”)
101. Herencia II
• Hay que llamar al constructor padre
explícitamente para obtener sus valores
103. Herencia IV
• Primero busca en la
clase hija (método,
variable), si no lo
encuentra, busca en el
padre
• Todos los métodos son
virtuales
104. Herencia V
• isinstance(obj, class)
• obj: instancia a comprobar
• class: clase sobre la que se comprueba el obj
• issubclass(sonClass, baseClass)
• sonClass: clase hija que se quiere comprobar
• baseClass: clase sobre la que se comprueba
105. Ejercicio: Herencia
• https://gist.github.com/gonzalezgarciacristian/1bb60b6bb573c3155428
• Crear “Figure “
• Métodos de “Figure”
• area: no hace nada
• areas: calcula el area total de una lista de figuras
• are_archenemy: comprueba si dos figuras son del mismo tipo
• “Square” y “Circle”
• Heredan de “Figure”
• Crear constructors con sus atributos
• Sobreescribir método “area”
• Para el círculo usad “math.pi”
• “Square”
• Dos atributos: “width” y “height”
• “Circle”
• Un atributo: “radio”
106. Herencia múltiple
• Se pasan la clases padre entre paréntesis
• Preferencia de izquierda a derecha
• Todas las clases heredan de Object
• Más información:
https://www.python.org/download/releases/2.3/mro/
107. Herencia múltiple II
• Si especificamos el padre, deberemos de
hacerlo en todos los métodos que deseemos,
si no, funciona de izquierda a derecha
108. Privacidad I
• Python no tiene encapsulación
• Python consigue la encapsulación mediante la
convención de nombres
• _name: Privado aunque accesible
• __name: Anti colisiones entre métodos heredados
• Obliga a especificar el nombre de la clase que lo
implementa (mangling): _Classname__name()
• __name__: Elimina el mangling y evita tener que
especificar el nombre de la clase
• https://docs.python.org/3/tutorial/classes.html#priv
ate-variables
110. Excepciones I
• La clase debe heredar de “Exception”
• Se lanzan con
• raise Class: Lanza una excepción de esa clase
• raise Instance: Lanza una excepción del tipo de
esa instancia
111. Excepciones II
• “except” puede capturar nuestra excepción
• Tiene prioridad siempre la excepción de la
clase padre
112. Iteradores I
• El “for” utiliza iteradores
• Contiene el método __next__(self)
• Contiene la lógica de como iterar esos tipos de
objetos
• Cuando no hay elementos, lanza la excepción
“StopIteration”
113. Iteradores II
• Para crear un objeto iterable
• Implementar el método __iter__(self)
• Definir el comportamiento en __next__(self)
• Lanzar la excepción “StopIteration” para evitar el error:
“IndexError: string index out of range”
114. Generadores I
• Herramienta para crear iteradores
• Los iteradores pueden hacer lo mismo que los
generadores
• Se crean con la palabra reservada “yield”
• Diferencias con los iteradores
• Autocrea el __iter__(self)
• Autocrea el __next__(self)
• Se encargan de la excepción “StopIteration”
116. Constantes
• No hay constantes de clase de forma nativa
• Hay formas de simularlas
• Excepciones
• Método que devuelva un valor
117. Métodos estáticos
• Aquellos métodos que no utilizan ninguna
variable o método de la instancia (self)
• No llevan el atributo “self”
• Se marcan con “@staticmethod”
118. Métodos abstractos
• Módulo: abstract base classes
(ABCs)
• Hay que marcar el método
requerido
• @abc.abstractmethod
• La clase padre no se podrá
instanciar, pues será abstracta
• Las clases hijas
• Tendrán un warning si no lo
implementan
• TypeError: Can't instantiate
abstract class Duck with
abstract methods talk
119. Métodos estáticos abstractos
• El padre
• Debe marcar el método
con
• @staticmethod
• @abc.abstractmethod
• El hijo
• Debe implementar el
método
• Debe marcarlo con
“@staticmethod”
121. Duck Typing I
• “Cuando veo un ave que camina como un pato, nada
como un pato y suena como un pato, a esa ave yo la
llamo un pato” – Davis, Robin S.
• El conjunto de métodos y propiedades del objeto
determina su tipo, en vez de la herencia
• Permite polimorfismo sin herencia
• El estado dinámico del objeto determina las
operaciones que este puede realizar y no su herencia
• Si posee un método lo ejecuta
• Si no, lanza una excepción AttributeError
• Se evita hacer comprobaciones de instancia
(isinstance()) y de tipo (type())
• “Es mas fácil pedir perdón que pedir permiso”
122. Duck Typing II
• De esta manera, una función puede recibir un
objeto y ejecutar lo que deba, en el caso de que
el objeto pasado no pueda, se lanza el error
• Recae en el programador el pasar el objeto
adecuado
• Mejor conocimiento del programa
• Buenas prácticas de programación
• Excepciones
• Pruebas
• “Si camina como un pato y nada como un pato,
podría ser un dragón imitando a un pato”
125. Crear ejecutable para Windows
• Hay que utilizar la herramienta py2exe
• Solo disponible actualmente para Python 2
• http://www.py2exe.org/
• Para Python 3 está en desarrollo
• https://pypi.python.org/pypi/py2exe/0.9.2.0
• Pasos
127. Flask
• Microframework ligero para aplicaciones web
• Modularizado
• Muchos módulos para extenderlo
• BBDD de objetos, validación de formularios, autenticación…
• Escrito en Python
• Utiliza el motor de plantillas Jinja2
• Crear/Generar HTML por código
• Licencia BSD
• Uso comercial, modificable, distribuible, se puede sublicenciar y dar garantía
• Multiplataforma
• RESTful
• Contiene servidor (puerto 5000) y modo de depuración
• Soporte integrado para test unitarios
• Tiene implementado un sistema de cookies seguras
• 1 de abril de 2010 – 14 de Junio de 2013 (Última release)
• http://flask.pocoo.org/
128. Django
• La “D” es muda
• Framework de código abierto
• Escrito en Python
• Arquitectura Modelo-Vista-Controlador
• Utilizado por: Pinterest, Instagram, Mozilla, …
• Utiliza su propio motor de plantillas
• Crear/Generar HTML por código
• Posee un framework para la caché
• Sistema de internacionalización
• Soporte integrado para test unitarios
• Licencia BSD
• Uso comercial, modificable, distribuible, se puede sublicenciar y dar garantía
• Multiplataforma
• Contiene servidor (puerto 8000) y modo de depuración
• Mantenido por la Django Software Foundation
• Integración en diferentes IDE: Aptana, PyCharm, Eclipse,…
• 21 de Julio del 2005 – 2 de Septiembre del 2014 (Última release)
• https://www.djangoproject.com/