Оглавление
Marco Buttu. El gran libro de Python
El Gran libro de Python
Sumario
Introducción
A quién va dirigido
Contenido del libro
Material y contactos
Agradecimientos
Los fundamentos del lenguaje
Introducción a Python
Desarrollo de Python
El estado del arte
La comunidad italiana de Python
Implementaciones de Python
Modos de ejecución del código Python
Modo interactivo
Ejecución de cadenas pasadas desde la línea de comandos
Introducción al lenguaje
Indentación del código
Los objetos integrados
Tipos de datos básicos
Las cadenas de texto
Las listas
Las tuplas
Los diccionarios
Los conjuntos
Funciones y clases integradas
Un primer vistazo a la librería estándar y al concepto de módulo
Definir las funciones
Definir las clases
Un primer vistazo a los archivos
La función integrada print()
Obtener información sobre los objetos
La función integrada dir()
La función integrada help() y las cadenas de documentación
El Zen de Python
Los elementos del código Python
Los comentarios
Literales
Operadores
Palabras clave
Delimitadores
Las etiquetas
Arquitectura de un programa Python
Las expresiones
Las instrucciones
Instrucciones simples
La asignación
La instrucción pass
La instrucción del
La instrucción return
La instrucción import
La instrucción from
La instrucción assert
Instrucciones compuestas
La instrucción if
La instrucción for
La instrucción while
Los módulos como contenedores de instrucciones
La Python Virtual Machine
Etiquetas y objetos
Definición de objeto
El vínculo entre las etiquetas y los objetos
Objetos mutables e inmutables
Modificación de objetos mutables
Inmutabilidad
Objetos inmutables que contienen objetos mutables
Los atributos son etiquetas
Etiquetas y nombres
Tipos de errores
Errores de sintaxis
Las excepciones
La gestión de las excepciones
Objetos iterables, iteradores y contexto de iteración
El protocolo de iteración
Las clases integradas range y enumerate
El contexto de iteración
Ejercicio final
Ejecución del script
Paso de los argumentos desde la línea de comandos
La interacción con el sistema operativo
Listas por comprensión
Expresiones de formato de las cadenas de texto
El corazón del lenguaje
Números
Números enteros
Operadores que permiten procesar los números enteros
Elevación a la potencia
División natural y floor
Operadores de comparación
Operadores de desplazamiento
Las enumeraciones de enteros
Aritmética de los números enteros
Números de punto flotante
Conversiones
Conversiones explícitas
Conversiones implícitas
Aritmética de los números de punto flotante
La notación de punto flotante
IEEE Standard for Binary Floating-Point Arithmetic
Valores máximo y mínimo representables
Underflow y overflow
Máquina de precisión
Métodos de los números de punto flotante
Números complejos
Booleanos
Introducción al concepto de herencia entre tipos
El vínculo entre los tipos bool e int
Expresiones lógicas
Librerías externas
Operaciones y funciones integradas utilizables con objetos iterables
Operaciones comunes para los objetos iterables
Desempaquetado
Prueba de pertenencia
Iteración
Funciones integradas que implican o devuelven objetos iterables
El módulo itertools de la librería estándar
Los conjuntos matemáticos
Set
Operaciones entre conjuntos
Los métodos de los conjuntos
Conjuntos por comprensión
Los conjuntos inmutables
Diccionarios
Métodos de los diccionarios
Diccionarios e iteraciones
Diccionarios ordenados
Persistencia y serialización de los objetos
Las secuencias
Operaciones comunes a las secuencias
Indexación y fragmentación
Concatenación y repetición
La prueba de la verdad
Cadenas
Los sistemas de codificación de caracteres
La representación de caracteres en formato digital
American Standard Code for Information Interchange
Cadenas de bytes
El estándar Unicode
Sistemas de codificación basados en el estándar Unicode
Conversiones entre cadenas de texto y cadenas de bytes
Secuencias de escape
Secuencias de escape representativas de algunos caracteres ASCII de control
Secuencias de escape representativas de algunos caracteres ASCII imprimibles
Secuencias de escape que permiten representar una parte de los caracteres Unicode
Secuencias de escape que permiten representar cualquier carácter Unicode
Métodos de las cadenas
Métodos comunes a las cadenas de texto y a las de bytes
Métodos específicos de las cadenas de texto
Métodos específicos de las cadenas de bytes
Formato de las cadenas de texto
Expresiones de formato de las cadenas de texto
Formato de cadenas de texto utilizando métodos y funciones integradas
Cadenas de bytes mutables
Listas
Métodos de las listas
Tuplas
Las tuplas con nombre
Ejercicio final
Ejecución del script
Análisis de los argumentos pasados desde la línea de comandos
El analizador
El espacio de nombres de los argumentos
El tipo de los argumentos
Argumentos opcionales y valores predeterminados
Valores dentro de un cierto rango
El análisis de los argumentos de webstats.py
Trabajar con fechas
El módulo collections de la librería standard
Funciones, generadores y archivos
Definición y llamada de una función
Parámetros, argumentos y valores de retorno
Modos de emparejamiento de argumentos con parámetros
Emparejamiento por nombre
Emparejamiento con valores por defecto
Emparejamiento con varargs
Emparejamiento solo por palabra clave
Emparejamiento con desempaquetado de objetos iterables
Emparejamiento con kwargs
Emparejamiento con desempaquetado de objetos diccionario
Funciones anónimas
Introspección de funciones
Introspección mediante atributos
Introspección estática mediante el módulo dis
Introspección con anotaciones
Introspección mediante el módulo inspect
Introspección con las funciones integradas
Generadores
Funciones generadoras
Corrutinas
Expresiones generadoras
Subgeneradores
Archivos
Lectura y escritura
Iterar sobre las líneas de un archivo
Los parámetros de la función open()
El parámetro file
Mode
Buffering
Encoding y errors
Newline
Closefd
Opener
Ejercicio final
Ejecución del script
Búsqueda de los archivos
Recorrer los directorios
El soporte para los comodines
La función generadora file_finder()
La función generadora file_inspector()
Expresiones regulares
Practicar con las expresiones regulares
El módulo re de la librería estándar
El parámetro action de add_argument()
Módulos, paquetes, entornos virtuales y aplicaciones
Módulos
Tipos de módulos
Módulos Python
Módulos compilados
Módulos integrados
Las extensiones
Tipologías de módulos Python
Contenedor puro de atributos
Script
Los módulos híbridos y la etiqueta global __name__
Rutas de búsqueda de los módulos
Variantes de la instrucción import
Importación de módulos ya importados y función imp.reload()
Importaciones circulares
Paquetes
Uso de paquetes
Paquetes regulares
Paquetes de espacio de nombres
Espacio de nombres, ámbito y resolución de nombres
El espacio de nombres integrado
Espacio de nombres global
Espacio de nombres local
Ámbito y resolución de nombres
Resolución de los nombres en el ámbito local
Etiquetas locales libres asignadas estáticamente al ámbito envolvente
Etiquetas libres asignadas estáticamente al ámbito global
Resolución de las etiquetas en el ámbito integrado
Instalación de paquetes
Python distribution utilities: distutils
Pip installs Python
Entornos virtuales
El módulo venv de la librería estándar
Duplicados de entornos
Ejercicio final
La prueba de validación de cadenas de documentación
Introducción al módulo doctest de la librería estándar
Uso del módulo doctest
El archivo pyfinder.py
Ejemplos con resultados independientes del sistema operativo y de la instalación de Python
Indicadores de opción y directivas
Instalación de la aplicación
Distribuir las aplicaciones
Crear una distribución de la aplicación
Source distribution
Built distribution
Publicar la distribución en PyPI
Registrar la aplicación en PyPI
Cargar la aplicación en PyPI
Clases y programación orientada a objetos
Clases e instancias
El parámetro self
Atributos de clase y de instancia
Ámbito y espacio de nombres
Diferencias de implementación entre el espacio de nombres de clase y de instancia
Atributos ocultos
El inicializador
Un primer vistazo a la sobrecarga
La composición
La herencia
La clase integrada super
Herencia múltiple y orden de resolución de métodos
Utilizamos super, porque es súper
Anular o sobrescribir métodos de las clases base
Introducción a las clases base abstractas y al módulo abc
Comportamiento de isinstance() e issubclass() con la herencia
Los decoradores
La función functools.wraps()
Decoradores que aceptan argumentos
Los métodos y las propiedades
Métodos de clase
Métodos estáticos
Método de instancia
Diferencias entre los tres tipos de métodos
Casos de uso
Métodos de clase para inicializar las instancias de diferentes maneras
Ejemplo de uso de un método estático
Las propiedades
Introducción a los patrones de diseño
El movimiento patrón
La clasificación de los patrones de diseño
Monostate
Solución
Los antipatrones
Programación copiar y pegar
Forma
Síntomas
Causas
Solución
Las excepciones
El mensaje de error
El rastreo
El tipo de excepción
La causa del error
La gestión de las excepciones
La cláusula except
Gestionar distintos tipos de excepciones en la misma cláusula except
Gestionar las excepciones en más cláusulas except
La forma except as permite obtener información acerca de las excepciones
Capturar todos los tipos de excepción con una única cláusula except genérica
Obtener información de la excepción capturada con una except genérica
El problema de las etiquetas que no consiguen asignarse en la cláusula try
La cláusula finally
La cláusula opcional else
Generar excepciones manualmente
La instrucción raise
La instrucción assert
Excepciones y herencia
La jerarquía de los tipos de excepciones integradas
Excepciones que representan errores
Excepciones utilizadas para notificar advertencias
Las excepciones de tipo StopIteration
Los tipos de excepción que no heredan de Exception
Cómo capturar todas las excepciones de manera genérica
Utilizar el tipo más especializado
Todas las excepciones tienen el atributo args
Ejemplo práctico sobre la gestión de las excepciones
La instrucción with y los gestores de contexto
La instrucción with
La cláusula as
Ejemplos de uso de la instrucción with
Los gestores de contexto
Definir clases que instancian gestores de contexto
Funciones gestoras de contexto
Ejercicio final
Ejecución del programa
El módulo cmd de la librería estándar
La clase cmd.Cmd
Atributos mágicos, metaclases y desarrollo guiado por pruebas
El modelo a objetos de Python
La clase type
La clase object
Tipos y no-tipos
Duck typing
Sobrecarga dinámica
Los atributos mágicos
La creación de instancias
El método especial __call__()
El método especial __new__()
Implementación del patrón de instancia única con anulación del constructor
Heredar de los tipos inmutables
El método especial _ _init_ _()
La finalización de instancias
Sobrecarga de operadores
Sobrecarga de los operadores aritméticos y herencia
Operaciones conmutativas
Los operadores de asignación aumentada
Sustracción, multiplicación y valor absoluto
Indexación y fragmentación
Iteración
Acceso a los atributos
Los métodos __getattr__(), __setattr__() y __delattr__()
El atributo mágico __getattribute__()
Descriptores
Búsqueda de atributos
Metaclases
El mito de la magia más profunda
La metaclase type
Personalizar el proceso de creación de clases
Crear nuevas metaclases
Elegir la metaclase de nuestras clases
La creación de clases
La preparación del diccionario de atributos
La llamada al método __prepare__()
Creación del atributo __dict__ de la clase
Algunos ejemplos de uso de metaclases
Modificar el prefijo de los atributos ocultos
Implementación del patrón de instancia única con las metaclases
Impedir la instanciación de clases homónimas
Orden de definición de los atributos en la sentencia class
Metaclases que aceptan argumentos opcionales
Desarrollo guiado por pruebas
El flujo de trabajo del desarrollo guiado por pruebas
Escribir la prueba y asegurarse de que falle
Implementar una versión mínima del código que permita superar la prueba
Realizar la refactorización del código
Las pruebas automáticas
La importancia de las pruebas automáticas
Los tipos de prueba
Las pruebas unitarias automáticas
El módulo unittest de la librería estándar
Los casos de prueba
El ejecutor de pruebas y las afirmaciones
Los ensayos de pruebas
Descubrimiento de pruebas
Comparación entre pruebas unitarias y pruebas de validación de cadenas de documentación
Ejemplo práctico de uso del desarrollo guiado por pruebas
Implementación y validación del descriptor
Escribir una prueba unitaria y comprobar que falle
Implementar las funcionalidades solicitadas
Refactorización
Implementación y validación de la metaclase
Escribir una prueba unitaria y comprobar que falle
Implementar las funcionalidades solicitadas
Refactorización
Las enumeraciones
Los miembros de una enumeración
Ejercicio final
Miembros ordenados, miembros instancias de la enumeración y miembros con atributos nombre y valor
Escribir una prueba unitaria y comprobar que falle
Implementar las funcionalidades solicitadas
No puede haber dos miembros con el mismo nombre
Escribir una prueba unitaria y comprobar que falle
Implementar la funcionalidad solicitada
Los miembros no pueden ser ni reasignados ni cancelados
Escribir una prueba unitaria y comprobar que falle
Implementar la funcionalidad solicitada
Un miembro con el mismo valor que otro es un alias
Escribir una prueba unitaria y comprobar que falle
Implementar la funcionalidad solicitada
Las enumeraciones son objetos iterables
Escribir las pruebas unitarias y comprobar que fallen
Implementar las funcionalidades solicitadas
Pasta[‘nombre_miembro’] debe devolver el miembro
Escribir una prueba unitaria y comprobar que falle
Implementar la funcionalidad solicitada
Pasta(value) debe devolver el miembro que tiene value como valor
Escribir una prueba unitaria y comprobar que falle
Implementar la funcionalidad solicitada
Refactorización
Apéndice A. Descripción de los comandos Unix-like utilizados en el libro
cat
chmod
cut
diff
echo
find
grep
head
ln
Is
mkdir
more
mv
pwd
rm
sed
source
tail
tar
time
touch
tree
wc
wget
which
zip
Los metacaracteres
Los comodines
Redirección
La barra vertical
Variables de entorno
PWD
HOME
Apéndice B. Principales puntos de rotura entre Python 2 y Python 3
Incompatibilidades entre las dos versiones
Print es una función integrada en Python 3 y una sentencia en Python 2
División natural y división en floor
Las funciones integradas input() y raw_input()
La función integrada file() ya no existe en Python 3
Las funciones integradas range(), filter(), map() y zip()
Los métodos keys(), values() e items() de los diccionarios
Listas por comprensión
Cadenas de texto y bytes
Unificación entre enteros y long
En Python 3 ya no existe la función integrada apply()
En Python 2 exec es una palabra clave y en Python 3, una función integrada
Uso inconsistente de espacios y tabulaciones
Migración automática de Python 2 a Python 3
Apéndice C. El buffering de los archivos