El documento presenta tres partes:
1) Persistencia y serialización con pickle, que permite convertir objetos Python en secuencias de bytes para almacenarlos en archivos.
2) Shelve, que permite almacenar objetos Python en archivos de manera persistente como si fueran diccionarios.
3) Un ejemplo práctico de una simulación de una universidad con clases como Alumno, Profesor, Materia, etc. y el uso de pickle para guardar y cargar la instancia completa de la Universidad.
The document discusses recommendations to prevent accidental heparin overdoses in neonates after an incident where 3 neonates died from overdoses. It recommends eliminating high concentration heparin vials, requiring independent double checks of drugs, and reducing similar drug packaging. Unintended medication discrepancies are common at hospital admission and accurate medication histories are important. National patient safety goals include reconciling medications, reducing infections, and falls.
Conscious Discipline - Behavior and the BrainTimothy Adams
The document discusses traditional discipline versus conscious discipline.
[1] Traditional discipline uses fear and punishment to obtain obedience through rule-following, while conscious discipline focuses on changing adult behaviors, uses brain science showing fear is detrimental, and sees conflicts as learning opportunities rather than disruptions.
[2] Conscious discipline is a comprehensive social-emotional program that empowers educators and parents through self-regulation. It recognizes three brain states (executive, emotional, survival) and teaches skills to connect children's behaviors to their internal states.
[3] The key principles of conscious discipline are focusing attention on desired behaviors, using assertive communication through clear commands and I-messages, and helping children develop self-
El Grupo FOSSD de la Facultad de Ciencias de la Computación de la Benemérita Universidad Autónoma de Puebla invita a la presentación oficial de la distribución de Linux desarrollada en el laboratorio de software libre el 29 de junio de 2010 a la 1:00 p.m. en el Auditorio "Albert Einstein".
Este documento presenta una discusión sobre las diferencias principales entre los sistemas operativos GNU/Linux y BSD. Algunas de las diferencias clave son las licencias de código abierto, el control del código fuente, el énfasis en el kernel frente al sistema operativo completo, la forma en que se actualizan los paquetes, y el soporte para hardware de última generación. En general, GNU/Linux tiende a adoptar tecnología más reciente mientras que BSD ofrece un sistema operativo más cohesionado desde su núcleo.
Metasploit is a program and framework for developing and using exploits. It allows penetration testers to quickly test exploits against multiple systems simultaneously and automates many penetration testing tasks. Some key advantages of Metasploit include facilitating simultaneous exploitation of systems on a network, integrating with other scanning tools to target specific vulnerabilities, and simplifying post-exploitation activities through its Meterpreter module. The document provides an overview of Metasploit and demonstrates how to use some of its basic features through an example exploit against a Windows system.
Este documento describe el desarrollo de un cliente POP3 llamado fetchmail para recoger correo electrónico de un servidor remoto y entregarlo localmente. El autor quería un cliente POP3 que pudiera capturar direcciones de correo para que las respuestas funcionaran correctamente. Después de probar varios clientes existentes, decidió desarrollar su propio cliente llamado fetchmail para satisfacer esta necesidad.
Este documento describe la contradicción entre la ideología oficial del código abierto y el verdadero comportamiento de los hackers. Explica que la cultura hacker ha evolucionado de una visión más radical promovida por la Free Software Foundation a una visión más pragmática impulsada por proyectos como Linux. También describe las variaciones en las actitudes hacia el software comercial dentro de la cultura hacker y cómo diferentes proyectos han desarrollado sus propias ideologías de forma independiente.
Este artículo resume la historia de PyAr, la comunidad de Python en Argentina. Comenzó en 2004 con la primera reunión entre Facundo Batista y Pablo Ziliani. Luego se formó oficialmente el grupo "PyAr - Python Argentina" y crearon una lista de correo y sitio web. En los primeros años, las reuniones mensuales atrajeron entre 4 y 7 personas. En 2005 participaron en una conferencia para dar a conocer Python. En 2006 el grupo creció a 10-20 personas por reunión y comenzaron nuevos proyectos como remeras y un canal IRC.
The document discusses recommendations to prevent accidental heparin overdoses in neonates after an incident where 3 neonates died from overdoses. It recommends eliminating high concentration heparin vials, requiring independent double checks of drugs, and reducing similar drug packaging. Unintended medication discrepancies are common at hospital admission and accurate medication histories are important. National patient safety goals include reconciling medications, reducing infections, and falls.
Conscious Discipline - Behavior and the BrainTimothy Adams
The document discusses traditional discipline versus conscious discipline.
[1] Traditional discipline uses fear and punishment to obtain obedience through rule-following, while conscious discipline focuses on changing adult behaviors, uses brain science showing fear is detrimental, and sees conflicts as learning opportunities rather than disruptions.
[2] Conscious discipline is a comprehensive social-emotional program that empowers educators and parents through self-regulation. It recognizes three brain states (executive, emotional, survival) and teaches skills to connect children's behaviors to their internal states.
[3] The key principles of conscious discipline are focusing attention on desired behaviors, using assertive communication through clear commands and I-messages, and helping children develop self-
El Grupo FOSSD de la Facultad de Ciencias de la Computación de la Benemérita Universidad Autónoma de Puebla invita a la presentación oficial de la distribución de Linux desarrollada en el laboratorio de software libre el 29 de junio de 2010 a la 1:00 p.m. en el Auditorio "Albert Einstein".
Este documento presenta una discusión sobre las diferencias principales entre los sistemas operativos GNU/Linux y BSD. Algunas de las diferencias clave son las licencias de código abierto, el control del código fuente, el énfasis en el kernel frente al sistema operativo completo, la forma en que se actualizan los paquetes, y el soporte para hardware de última generación. En general, GNU/Linux tiende a adoptar tecnología más reciente mientras que BSD ofrece un sistema operativo más cohesionado desde su núcleo.
Metasploit is a program and framework for developing and using exploits. It allows penetration testers to quickly test exploits against multiple systems simultaneously and automates many penetration testing tasks. Some key advantages of Metasploit include facilitating simultaneous exploitation of systems on a network, integrating with other scanning tools to target specific vulnerabilities, and simplifying post-exploitation activities through its Meterpreter module. The document provides an overview of Metasploit and demonstrates how to use some of its basic features through an example exploit against a Windows system.
Este documento describe el desarrollo de un cliente POP3 llamado fetchmail para recoger correo electrónico de un servidor remoto y entregarlo localmente. El autor quería un cliente POP3 que pudiera capturar direcciones de correo para que las respuestas funcionaran correctamente. Después de probar varios clientes existentes, decidió desarrollar su propio cliente llamado fetchmail para satisfacer esta necesidad.
Este documento describe la contradicción entre la ideología oficial del código abierto y el verdadero comportamiento de los hackers. Explica que la cultura hacker ha evolucionado de una visión más radical promovida por la Free Software Foundation a una visión más pragmática impulsada por proyectos como Linux. También describe las variaciones en las actitudes hacia el software comercial dentro de la cultura hacker y cómo diferentes proyectos han desarrollado sus propias ideologías de forma independiente.
Este artículo resume la historia de PyAr, la comunidad de Python en Argentina. Comenzó en 2004 con la primera reunión entre Facundo Batista y Pablo Ziliani. Luego se formó oficialmente el grupo "PyAr - Python Argentina" y crearon una lista de correo y sitio web. En los primeros años, las reuniones mensuales atrajeron entre 4 y 7 personas. En 2005 participaron en una conferencia para dar a conocer Python. En 2006 el grupo creció a 10-20 personas por reunión y comenzaron nuevos proyectos como remeras y un canal IRC.
Este documento presenta una introducción al lenguaje de programación Python. Explica características como su sintaxis sin llaves, tipos de datos comunes, y estructuras útiles como generadores y decoradores. También cubre el framework Django para desarrollo web, incluyendo organización de proyectos, ORM, enrutamiento, vistas y plantillas. Finalmente, introduce conceptos como formularios, vistas genéricas y el administrador de Django.
Este documento presenta una introducción a los patrones de diseño en Python. Explica brevemente algunos patrones de diseño creacionales como Singleton y Prototype, así como patrones estructurales como Decorator y Visitor. También cubre cómo las características dinámicas y de abstracción de Python permiten implementar patrones de forma natural. Finalmente, introduce algunos antipatrones como Spaghetti Code, Blob y Obfuscation.
02 python Programación orientada a objetos y funcionalJuan Rodríguez
Este documento describe los conceptos básicos de programación orientada a objetos en Python. Explica cómo crear clases, objetos, herencia y polimorfismo. También cubre temas como sobrecarga de operadores, métodos especiales y tratamiento de excepciones.
El documento presenta una introducción a los conceptos básicos de la programación orientada a objetos. Explica las diferencias entre la programación procedural y la orientada a objetos, y define conceptos clave como clases, objetos, herencia, polimorfismo y encapsulamiento. También describe brevemente los beneficios de la programación orientada a objetos como la reutilización de código, el mantenimiento y la extensibilidad.
Este documento describe un carrusel de citas que muestra citas de forma automática cada 2 segundos. También permite cambiar la cita mostrada al hacer clic en los botones de una barra de navegación inferior que representa cada cita. Las citas se almacenan en un array externo y la barra de navegación se genera dinámicamente para permitir cambiar entre ellas.
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores y variables de instancia. También muestra ejemplos de cómo definir una clase Circle que modela un círculo, crear instancias de objetos Circle y acceder a sus atributos y métodos.
El documento describe los conceptos básicos de la programación orientada a objetos, incluyendo definir clases, atributos, métodos, constructores, encapsulamiento, herencia y paquetes. Explica cómo modelar el mundo real mediante objetos y clases, y cómo diseñar un sistema de software usando estas herramientas.
El documento describe los conceptos básicos de la programación orientada a objetos. Explica que en la POO todo es un objeto con características (datos) y acciones (funciones), y que los programas están compuestos por objetos que se comunican a través de mensajes. También define conceptos clave como clase, objeto, herencia, polimorfismo, encapsulamiento y paso de mensajes.
Este documento presenta conceptos básicos de programación orientada a objetos en Python como clases, objetos, métodos, propiedades, inicializadores de clases e herencia. Explica cómo definir clases y crear objetos, así como el uso del método especial __init__() para inicializar las variables de instancia. También cubre la herencia de clases y cómo crear excepciones propias heredando de la clase base Exception.
El documento explica los conceptos básicos de la programación orientada a objetos. Compara la programación procedural con la orientada a objetos, donde todo es un objeto con atributos (datos) y métodos (funciones). Explica conceptos como clases, objetos, herencia, polimorfismo, encapsulamiento y paso de mensajes.
Este documento presenta una práctica sobre herencia en PHP orientada a objetos. Instruye al estudiante en crear clases padre e hija que representan personas y docentes respectivamente. También incluye dos prácticas adicionales sobre herencia de clases: una que crea clases para cuentas bancarias y otra que extiende la clase de cuentas para crear una clase específica para cuentas de ahorro. El estudiante debe completar las prácticas siguiendo el patrón MVC y crear diagramas de herencia
Este documento describe los pasos para configurar las relaciones entre modelos y tablas en una aplicación Ruby on Rails. Inicialmente, se definen las irregularidades de nombres en singular y plural. Luego, se generan los modelos y tablas usando scaffolding para diferentes entidades como carreras, profesores, salones, etc. Finalmente, se agregan validaciones a los modelos y se establecen las relaciones entre las tablas para habilitar funcionalidades como listar alumnos por materia.
Este documento presenta conceptos básicos de Java, incluyendo tipos de datos primitivos y complejos, operadores, estructuras de control, clases y objetos, herencia y polimorfismo. También cubre temas como encapsulamiento, constructores, métodos get y set, y el uso de la palabra clave 'this'.
Este documento proporciona instrucciones para desarrollar un módulo para el buscador Visuse. Explica los pasos necesarios para crear las clases que definan los resultados de búsqueda y el proceso de búsqueda, así como probar el módulo.
Trabajo 2. ayudantía. elmar alarcón namuncuraElmar Namuncura
Este documento presenta las actividades realizadas en un laboratorio sobre consultas SQL en Oracle. Contiene 11 consultas SQL con el objetivo de obtener información sobre préstamos de libros de una biblioteca universitaria, como estudiantes con préstamos atrasados, deudas acumuladas, carreras con mayor cantidad de préstamos y libros más solicitados.
El documento habla sobre el tema de herencia en programación orientada a objetos. Explica que la herencia permite que una clase herede los atributos y comportamientos de otra clase base. Define los tipos de herencia simple y múltiple, e ilustra su implementación en Java con ejemplos de clases Empleado y Ejecutivo. También cubre conceptos como los constructores, métodos de la clase Object y una aplicación de herencia de figuras geométricas.
El documento explica los conceptos básicos de clases y objetos en Java. Una clase define el estado y comportamiento de un objeto mediante atributos y métodos. Los objetos son instancias concretas de una clase que se crean usando el operador new. Los atributos y métodos de un objeto se pueden acceder usando la notación punto.
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores, herencia y polimorfismo. También muestra ejemplos de cómo definir clases Circle y Cylinder, con Cylinder heredando atributos y métodos de Circle.
Este documento explica los conceptos básicos de la programación orientada a objetos en Python. Introduce los principios de clases, objetos, atributos, métodos, encapsulación, herencia, polimorfismo y sus beneficios. Explica cómo definir clases, crear objetos e instanciarlas para modelar el mundo real.
1. El documento introduce conceptos básicos sobre clases, métodos y atributos en Java como elementos fundamentales para la programación orientada a objetos.
2. Se explica la declaración y estructura básica de una clase en Java incluyendo modificadores, atributos, métodos y constructores.
3. Se proveen recomendaciones sobre el uso de modificadores de acceso para atributos y métodos y ejemplos de clases simples.
Este documento describe dos técnicas para hackear Windows Vista:
1) Blue Pill permite ejecutar código malicioso de forma indetectable virtualizando el sistema operativo.
2) Red Pill inserta código arbitrario en el núcleo de Windows Vista sin firmas digitales. Ambas técnicas pueden combinarse para lograr un mayor nivel de inseguridad.
Este documento describe el desarrollo de un cliente POP3 llamado fetchmail para recoger correo electrónico de un servidor remoto y entregarlo localmente. El autor quería un cliente POP3 que pudiera capturar direcciones de correo correctamente para respuestas. Existían algunos clientes POP3 pero carecían de esta capacidad, por lo que el autor decidió desarrollar su propio cliente llamado fetchmail.
Este documento presenta una introducción al lenguaje de programación Python. Explica características como su sintaxis sin llaves, tipos de datos comunes, y estructuras útiles como generadores y decoradores. También cubre el framework Django para desarrollo web, incluyendo organización de proyectos, ORM, enrutamiento, vistas y plantillas. Finalmente, introduce conceptos como formularios, vistas genéricas y el administrador de Django.
Este documento presenta una introducción a los patrones de diseño en Python. Explica brevemente algunos patrones de diseño creacionales como Singleton y Prototype, así como patrones estructurales como Decorator y Visitor. También cubre cómo las características dinámicas y de abstracción de Python permiten implementar patrones de forma natural. Finalmente, introduce algunos antipatrones como Spaghetti Code, Blob y Obfuscation.
02 python Programación orientada a objetos y funcionalJuan Rodríguez
Este documento describe los conceptos básicos de programación orientada a objetos en Python. Explica cómo crear clases, objetos, herencia y polimorfismo. También cubre temas como sobrecarga de operadores, métodos especiales y tratamiento de excepciones.
El documento presenta una introducción a los conceptos básicos de la programación orientada a objetos. Explica las diferencias entre la programación procedural y la orientada a objetos, y define conceptos clave como clases, objetos, herencia, polimorfismo y encapsulamiento. También describe brevemente los beneficios de la programación orientada a objetos como la reutilización de código, el mantenimiento y la extensibilidad.
Este documento describe un carrusel de citas que muestra citas de forma automática cada 2 segundos. También permite cambiar la cita mostrada al hacer clic en los botones de una barra de navegación inferior que representa cada cita. Las citas se almacenan en un array externo y la barra de navegación se genera dinámicamente para permitir cambiar entre ellas.
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores y variables de instancia. También muestra ejemplos de cómo definir una clase Circle que modela un círculo, crear instancias de objetos Circle y acceder a sus atributos y métodos.
El documento describe los conceptos básicos de la programación orientada a objetos, incluyendo definir clases, atributos, métodos, constructores, encapsulamiento, herencia y paquetes. Explica cómo modelar el mundo real mediante objetos y clases, y cómo diseñar un sistema de software usando estas herramientas.
El documento describe los conceptos básicos de la programación orientada a objetos. Explica que en la POO todo es un objeto con características (datos) y acciones (funciones), y que los programas están compuestos por objetos que se comunican a través de mensajes. También define conceptos clave como clase, objeto, herencia, polimorfismo, encapsulamiento y paso de mensajes.
Este documento presenta conceptos básicos de programación orientada a objetos en Python como clases, objetos, métodos, propiedades, inicializadores de clases e herencia. Explica cómo definir clases y crear objetos, así como el uso del método especial __init__() para inicializar las variables de instancia. También cubre la herencia de clases y cómo crear excepciones propias heredando de la clase base Exception.
El documento explica los conceptos básicos de la programación orientada a objetos. Compara la programación procedural con la orientada a objetos, donde todo es un objeto con atributos (datos) y métodos (funciones). Explica conceptos como clases, objetos, herencia, polimorfismo, encapsulamiento y paso de mensajes.
Este documento presenta una práctica sobre herencia en PHP orientada a objetos. Instruye al estudiante en crear clases padre e hija que representan personas y docentes respectivamente. También incluye dos prácticas adicionales sobre herencia de clases: una que crea clases para cuentas bancarias y otra que extiende la clase de cuentas para crear una clase específica para cuentas de ahorro. El estudiante debe completar las prácticas siguiendo el patrón MVC y crear diagramas de herencia
Este documento describe los pasos para configurar las relaciones entre modelos y tablas en una aplicación Ruby on Rails. Inicialmente, se definen las irregularidades de nombres en singular y plural. Luego, se generan los modelos y tablas usando scaffolding para diferentes entidades como carreras, profesores, salones, etc. Finalmente, se agregan validaciones a los modelos y se establecen las relaciones entre las tablas para habilitar funcionalidades como listar alumnos por materia.
Este documento presenta conceptos básicos de Java, incluyendo tipos de datos primitivos y complejos, operadores, estructuras de control, clases y objetos, herencia y polimorfismo. También cubre temas como encapsulamiento, constructores, métodos get y set, y el uso de la palabra clave 'this'.
Este documento proporciona instrucciones para desarrollar un módulo para el buscador Visuse. Explica los pasos necesarios para crear las clases que definan los resultados de búsqueda y el proceso de búsqueda, así como probar el módulo.
Trabajo 2. ayudantía. elmar alarcón namuncuraElmar Namuncura
Este documento presenta las actividades realizadas en un laboratorio sobre consultas SQL en Oracle. Contiene 11 consultas SQL con el objetivo de obtener información sobre préstamos de libros de una biblioteca universitaria, como estudiantes con préstamos atrasados, deudas acumuladas, carreras con mayor cantidad de préstamos y libros más solicitados.
El documento habla sobre el tema de herencia en programación orientada a objetos. Explica que la herencia permite que una clase herede los atributos y comportamientos de otra clase base. Define los tipos de herencia simple y múltiple, e ilustra su implementación en Java con ejemplos de clases Empleado y Ejecutivo. También cubre conceptos como los constructores, métodos de la clase Object y una aplicación de herencia de figuras geométricas.
El documento explica los conceptos básicos de clases y objetos en Java. Una clase define el estado y comportamiento de un objeto mediante atributos y métodos. Los objetos son instancias concretas de una clase que se crean usando el operador new. Los atributos y métodos de un objeto se pueden acceder usando la notación punto.
Este documento presenta una introducción a la programación orientada a objetos en Python. Explica conceptos clave como clases, objetos, atributos, métodos, constructores, herencia y polimorfismo. También muestra ejemplos de cómo definir clases Circle y Cylinder, con Cylinder heredando atributos y métodos de Circle.
Este documento explica los conceptos básicos de la programación orientada a objetos en Python. Introduce los principios de clases, objetos, atributos, métodos, encapsulación, herencia, polimorfismo y sus beneficios. Explica cómo definir clases, crear objetos e instanciarlas para modelar el mundo real.
1. El documento introduce conceptos básicos sobre clases, métodos y atributos en Java como elementos fundamentales para la programación orientada a objetos.
2. Se explica la declaración y estructura básica de una clase en Java incluyendo modificadores, atributos, métodos y constructores.
3. Se proveen recomendaciones sobre el uso de modificadores de acceso para atributos y métodos y ejemplos de clases simples.
Este documento describe dos técnicas para hackear Windows Vista:
1) Blue Pill permite ejecutar código malicioso de forma indetectable virtualizando el sistema operativo.
2) Red Pill inserta código arbitrario en el núcleo de Windows Vista sin firmas digitales. Ambas técnicas pueden combinarse para lograr un mayor nivel de inseguridad.
Este documento describe el desarrollo de un cliente POP3 llamado fetchmail para recoger correo electrónico de un servidor remoto y entregarlo localmente. El autor quería un cliente POP3 que pudiera capturar direcciones de correo correctamente para respuestas. Existían algunos clientes POP3 pero carecían de esta capacidad, por lo que el autor decidió desarrollar su propio cliente llamado fetchmail.
Programacion Orientada a Objetos en pythonwozgeass
Este documento presenta conceptos clave de la programación orientada a objetos (POO) y su implementación en Python. Explica conceptos como clases, objetos, herencia, polimorfismo y métodos especiales. También describe cómo definir clases, crear objetos e instancias de clases, y sobrecargar operadores en Python.
La nueva versión de Python 3.0 (Py3K) introduce cambios hacia atrás incompatibles pero leves en comparación con otras actualizaciones de lenguajes de programación como VB, PHP y .NET. Algunos de los principales cambios incluyen la conversión de print a una función, la unificación de cadenas y tipos numéricos, y mejoras en formato, excepciones, clases y módulos. La documentación y ayuda sobre la transición a Python 3.0 se encuentra disponible en la página web de Python Argentina.
Este documento introduce el lenguaje de programación Python. Explica que Python es un lenguaje interpretado, de tipado dinámico y multiparadigma. También describe las características básicas del lenguaje como su sintaxis, tipos de datos incorporados, estructuras de control y algunas herramientas como el intérprete y el editor IDLE.
El documento proporciona una introducción a la biblioteca estándar de Python. Explica que incluye más de 300 módulos agrupados en categorías como cadenas, tipos de datos, números, archivos, persistencia, compresión, formatos, criptografía, sistema operativo, comunicación e Internet. También describe algunos módulos específicos como sys, time, re, StringIO, datetime y os, entre otros.
ACERTIJO DESCIFRANDO CÓDIGO DEL CANDADO DE LA TORRE EIFFEL EN PARÍS. Por JAVI...JAVIER SOLIS NOYOLA
El Mtro. JAVIER SOLIS NOYOLA crea y desarrolla el “DESCIFRANDO CÓDIGO DEL CANDADO DE LA TORRE EIFFEL EN PARIS”. Esta actividad de aprendizaje propone el reto de descubrir el la secuencia números para abrir un candado, el cual destaca la percepción geométrica y conceptual. La intención de esta actividad de aprendizaje lúdico es, promover los pensamientos lógico (convergente) y creativo (divergente o lateral), mediante modelos mentales de: atención, memoria, imaginación, percepción (Geométrica y conceptual), perspicacia, inferencia y viso-espacialidad. Didácticamente, ésta actividad de aprendizaje es transversal, y que integra áreas del conocimiento: matemático, Lenguaje, artístico y las neurociencias. Acertijo dedicado a los Juegos Olímpicos de París 2024.
La Unidad Eudista de Espiritualidad se complace en poner a su disposición el siguiente Triduo Eudista, que tiene como propósito ofrecer tres breves meditaciones sobre Jesucristo Sumo y Eterno Sacerdote, el Sagrado Corazón de Jesús y el Inmaculado Corazón de María. En cada día encuentran una oración inicial, una meditación y una oración final.
SEMIOLOGIA DE HEMORRAGIAS DIGESTIVAS.pptxOsiris Urbano
Evaluación de principales hallazgos de la Historia Clínica utiles en la orientación diagnóstica de Hemorragia Digestiva en el abordaje inicial del paciente.
José Luis Jiménez Rodríguez
Junio 2024.
“La pedagogía es la metodología de la educación. Constituye una problemática de medios y fines, y en esa problemática estudia las situaciones educativas, las selecciona y luego organiza y asegura su explotación situacional”. Louis Not. 1993.
1. Programación en Python
Parte 3: Persistencia y BB.DD.
Mariano Reingart
reingart@gmail.com
2. Persistencia y serialización: pickle
Pickle: convertir objeto python en secuencia de bytes
Funciones de pickle:
dumps(objeto, proto): serializa a un string
dump(objeto, archivo, proto): guarda en archivo
loads(cadena, proto): des-serializa un string
load(archivo, proto): carga desde archivo
>>> import pickle
>>> s = pickle.dumps({1:'a',2:'b'},0) >>> s
"(dp0nI1nS'a'np1nsI2nS'b'np2ns."
>>> print pickle.loads(s) {1: 'a', 2: 'b'}
4. Persistencia y serialización: shelve
Shelve: objeto similar a un diccionario persistente
open(filename, flag='c', protocol=None,
writeback=False): crea un diccionario persistente
flag= 'r': solo lectura, 'w': lectura/escritura, 'c':
creación y lectura/escritura, 'n': nuevo
Shelve.sync(): sincronizar (writeback=True)
Shelve.close(): grabar y cerrar diccionario
>>>import shelve
>>> d = shelve.open(filename) # abrir archivo >>> d['clave'] = 'datos' # almacenar
datos en una clave >>> data = d['clave'] # leer una COPIA de los datos >>> del d
['clave'] # borra los datos almacenados
5. Ejemplo práctico: universidad.py
Enunciado: administrar las cursadas y calificaciones
de los alumnos de una universidad "simplificada".
Profesores (dni, nombre, apellido, legajo)
Materias (código, nombre)
Cursos (materia, año, profesor)
Exámenes (materia, nota, fecha)
Alumnos (dni, nombre, apellido, nro_matrícula,
cursos, exámenes)
Universidad (alumnos, profesores, plan_estudio)
7. Ejemplo práctico: universidad.py
class Persona:
"Clase que representa una persona"
def __init__(self, dni, nombre, apellido):
"Constructor del objeto"
self.dni = dni
self.nombre = nombre
self.apellido = apellido
def __str__(self):
"Devuelvo la representación como string"
return "%s, %s" % (self.nombre, self.apellido)
def __repr__(self):
"Devuelve la representación interna"
return "Persona(dni=%s, nombre=%s, apellido=%s)" % (
repr(self.dni), repr(self.nombre),...)
def __hash__(self):
"Devuelvo el identificador único del objeto"
return self.dni
12. Ejemplo práctico: universidad.py
class Alumno(Persona):
"Clase para representar un Alumno"
def __init__(self, dni, nombre, apellido, nro_matricula):
Persona.__init__(self, dni, nombre, apellido)
self.nro_matricula = nro_matricula
self.cursos = [] # lista de materias cursadas
self.examenes = [] # lista de exámenes rendidos
def inscribir(self, curso):
self.cursos.append(curso)
def rendir(self, materia, nota, fecha):
examen = Examen(materia, nota, fecha)
# agrego el examen a la lista de los exámenes
self.examenes.append(examen)
13. Ejemplo práctico: universidad.py
class AlumnoRegular(Alumno):
def rendir(self, materia, nota, fecha):
if self.buscar_cursadas(materia):
Alumno.rendir(self, materia, nota, fecha)
else:
raise RuntimeError("El alumno no curso la materia %s" %
materia)
class AlumnoLibre(Alumno):
"Los alumnos libres no necesitan inscribirse previamente"
pass
14. Ejemplo práctico: universidad.py
class Universidad:
def __init__(self):
self.alumnos = []
self.profesores = []
self.plan_estudio = []
self.cursos = []
def guardar(self, nombre_archivo="universidad.dat"):
"Grabo la instancia en un archivo"
archivo = open(nombre_archivo, "wb")
# serializo el objeto universidad (max.protocolo)
pickle.dump(universidad, archivo, -1)
@staticmethod
def cargar(nombre_archivo="universidad.dat"):
"Cargg la instancia desde un archivo"
archivo = open(nombre_archivo, "rb")
return pickle.load(archivo)
15. Ejemplo práctico: universidad.py
def analitico(self, alumno):
"Muestro el estado de las materias del alumno"
print "Notas para el alumno: %s" % alumno
for materia in self.plan_estudio:
cursada = alumno.buscar_cursadas(materia) and True or False
# obtengo el último exámen rendido
examenes = alumno.buscar_examenes(materia)
if examenes:
# extraigo la última nota y fecha de exámen
nota = examenes[-1].nota
fecha = examenes[-1].fecha
else:
nota = fecha = ''
print "%3s: %-20s %5s %10s %s" % (
materia.codigo, materia.nombre,
nota, fecha, cursada and 'Cursada' or '')
print
16. Ejemplo práctico: universidad.py
def recibido(self, alumno):
"Reviso que todas las materias del plan de estudio esten aprobadas"
for materia in self.plan_estudio:
# busco los examenes aprobados de esta materia
if not [examen for examen
in alumno.buscar_examenes(materia)
if examen.aprobado]:
raise RuntimeError("%s no aprobo %s" % (alumno, materia))
#return False # no aprobó ningún/no tiene exámen
return True # aprobó todas las meterias
17. Ejemplo práctico: universidad.py
if __name__ == "__main__":
# si existen los datos, los deserealizo
if os.path.exists("universidad.dat"):
universidad = Universidad.cargar()
print "Cursos:"
pprint.pprint(universidad.cursos)
print "Alumnos"
pprint.pprint(universidad.alumnos)
else:
universidad = Universidad()
alumno1 = AlumnoLibre(dni=1234, nombre="Juan", apellido="Perez",
nro_matricula=1234)
alumno2 = AlumnoRegular(dni=5678, nombre="Luis", apellido="Gonzales",
nro_matricula=1234)
universidad.alumnos.extend([alumno1, alumno2])
...
universidad.guardar()
18. Ejemplo práctico: universidad.py
>>> ================================ RESTART
>>>
Notas para el alumno: Juan, Perez
1: Bases de datos 5 2009-01-03 Cursada
2: Programacion I 3 2009-02-03 Cursada
3: Programacion II 7 2009-02-03
Notas para el alumno: Luis, Gonzales
1: Bases de datos 7 2009-01-03 Cursada
2: Programacion I
3: Programacion II 10 2009-02-03 Cursada
Juan, Perez Juan, Perez no aprobo Programacion I (2)
Luis, Gonzales Luis, Gonzales no aprobo Programacion I (2)
>>> alumno1.rendir(materia2, nota=4, fecha=datetime.date.today())
>>> universidad.guardar()
19. Ejemplo práctico: universidad.py
>>> ================================ RESTART
>>> alumno1
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
alumno1
NameError: name 'alumno1' is not defined
>>> alumno1=universidad.alumnos[0]
>>> universidad.recibido(alumno1)
True
>>> universidad.analitico(alumno1)
Notas para el alumno: Juan, Perez
1: Bases de datos 5 2009-01-03 Cursada
2: Programacion I 4 2009-08-20 Cursada
3: Programacion II 7 2009-02-03
>>>
20. Ejemplo práctico: universidad.py
>>> ================================ RESTART
>>>
Notas para el alumno: Juan, Perez
1: Bases de datos 5 2009-01-03 Cursada
2: Programacion I 3 2009-02-03 Cursada
3: Programacion II 7 2009-02-03
Notas para el alumno: Luis, Gonzales
1: Bases de datos 7 2009-01-03 Cursada
2: Programacion I
3: Programacion II 10 2009-02-03 Cursada
Juan, Perez Juan, Perez no aprobo Programacion I (2)
Luis, Gonzales Luis, Gonzales no aprobo Programacion I (2)
>>> alumno1.rendir(materia2, nota=4, fecha=datetime.date.today())
>>> universidad.guardar()
21. DB-API: Interfase Estándar de BB.DD.
Funciones y atributos del Módulo:
connect(parametros...): crea una conexión
paramstyle: formato de los parámetros
'qmark': ej. '...WHERE name=?'
'numeric': ej. '...WHERE name=:1'
'named': ej. '...WHERE name=:name'
'format': ej. '...WHERE name=%s'
'pyformat': ej. '...WHERE name=%(name)s'
Excepciones
Tipos de datos avanzados
22. DB-API: Interfase Estándar de BB.DD.
Funciones y atributos del Módulo: Excepciones
Warning: advertencia (ej. texto truncado)
Error: clase base de errores
InterfaseError: error con la comunicación
DatabaseError: error con la base en si
OperationalError: error en "inesperado"
IntegrityError: integridad (PK, FK, etc.)
InternalError: error interno de la base de datos
ProgrammingError: error en el SQL
NotSupportedError: funcionalidad no soportada
23. DB-API: Interfase Estándar de BB.DD.
Funciones y atributos del Módulo:
Tipos/constructores
Date(año,mes,día): fecha
Time(hora,minuto,segundo): hora
Timestamp(año,mes,día,hora,minuto,
segundo): fecha y hora
Binarycasdena): objetos grandes (blobs)
STRING: tipo para cadenas
BINARY: tipo para blobls
NUMBER: numeros
DATETIME: fechas y/o horas
ROWID: identificador de filas
24. DB-API: Interfase Estándar de BB.DD.
Objetos Conexión:
.close(): cierra la conexión (.rollback si hay datos
pendientes)
.commit(): confirma transacción pendiente
.rollback(): deshace una transacción pendiente
.cursor(): crea un objeto Cursor
25. DB-API: Interfase Estándar de BB.DD.
Objetos Cursor:
.execute(sql, params): ejecuta una consulta sql
aplicando los parámetros params
.description: secuencia de datos de los
campos: (name, type_code, display_size,
internal_size, precision, scale, null_ok)
.rowcount: cantidad de filas devueltas o afectadas
.fechone(): devuelve un registro
.fechall(): devuelve todos los registros
.close(): cierra la conexión
26. DB-API: Interfase Estándar de BB.DD.
Pasos:
1. Importar el conector
2. Conectarse a la base de datos (función connect del
módulo conector)
3. Abrir un Cursor (método cursor de la conexión)
4. Ejecutar una consulta (método execute del cursor)
5. Obtener los datos (método fetch o iterar sobre el
cursor)
6. Cerrar el cursor (método close del cursor)
27. DB-API: Ejemplo SqLite
import sqlite3
con = sqlite3.connect(":memory:")
cur = con.cursor()
cur.execute("""
CREATE TABLE persona (nombre, apellido, edad)
""")
con.commit()
cur.execute("""
INSERT INTO persona VALUES ('Juan', 'Perez', 25);
""")
cur.execute("""
INSERT INTO persona VALUES ('Nilda', 'Rodriguez', 25);
""")
con.commit()
cur.execute("SELECT nombre, apellido, edad FROM persona")
for nombre, apellido, edad in cur:
print nombre, apellido, edad
28. DB-API: Ejemplo SqLite
import sqlite3
con = sqlite3.connect("mydb")
# acceder por nombre a las filas del cursor:
con.row_factory = sqlite3.Row
cur = con.cursor()
cur.execute("select apellido, edad from persona")
for row in cur:
assert row[0] == row["apellido"]
assert row["apellido"] == row["aPeLLido"]
assert row[1] == row["edad"]
assert row[1] == row["EdaD"]
29. DB-API: Ejemplo SqLite
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("create table persona (id integer primary key, nombre varchar
unique)")
# con.commit() se llama automáticamente si ok (con with)
with con:
con.execute("insert into persona(nombre) values (?)", ("Juan",))
# con.rollback() se llama si hay excepción:
try:
with con:
con.execute("insert into persona(firstname) values (?)", ("Juan",))
except sqlite3.IntegrityError:
print "no se puede agregar Juan dos veces"
32. DB-API: Ejemplo PostgreSQL
>>> import psycopg2.extras
>>> cur = conn.cursor(cursor_factory =
psycopg2.extras.DictCursor)
>>> cur.execute("SELECT * FROM estudiante")
>>> for row in cur: # itero sober cada fila
>>> # row es un diccionario, con las claves = campos
>>> print "Nombre y Apellido: %s, %s " % (row['nombre'],row['apellido'])
Nombre y Apellido: Joe, Capbell
Nombre y Apellido: Joe, Doe
Nombre y Apellido: Rick, Hunter
Nombre y Apellido: Laura, Ingalls
Nombre y Apellido: Virginia, Gonzalez
>>> print cur.description
(('nombre', 1043, 8, -1, None, None, None), ('apellido', 1043, 8, -1, None, None,
None), ('fecha', 1082, 10, 4, None, None, None), ('booleano', 16, 1, 1, None, None,
None), ('legajo', 23, 1, 4, None, None, None))
33. DB-API: Ejemplo PostgreSQL
>>> #Parámetros:
>>> cur = conn.cursor()
>>> cur.execute("insert into personas (apellido) values (%s)" , ["D'agostino"])
>>> cur.execute("insert into personas (apellido) values (%(apellido)s)" ,
{"apellido":"D'agostino"})
34. PlPython: Procedimientos almacenados
El lenguaje procedural plpython permite escribir
funciones python para la base de datos relacional
PostgreSQL.
El cuerpo de una funcion plpythonu es
simplemente un script de Python.
Los argumentos son pasados como elementos de
una lista args; los argumentos por nombre son
pasados como variables ordinarias.
El resultado es devuelto con un return o un yield
Los valores NULL equivalen a None.
Diccionario SD y GD (global)
35. PlPython: Procedimientos almacenados
Ejemplo Simple:
>>> CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if (a is None) or (b is None):
return None
if a > b:
return a
return b
$$ LANGUAGE plpythonu;
-- invoco la función:
SELECT pymax(2, 3);
-- devuelve 3
36. PlPython: Procedimientos almacenados
Recibir tipos compuestos:
CREATE TABLE empleado (
nombre TEXT,
salario INTEGER,
edad INTEGER
);
CREATE FUNCTION sueldo_alto (e empleado)
RETURNS boolean
AS $$
if e["salario"] > 200000:
return True
if (e["edad"] < 30) and (e["salario"] > 100000):
return True
return False
$$ LANGUAGE plpythonu;
37. PlPython: Procedimientos almacenados
Devolver tipos compuestos:
CREATE FUNCTION crear_persona (nombre TEXT, apellido TEXT)
RETURNS persona
AS $$
return [ nombre, apellido ]
# o como tupla: return ( nombre, apellido )
# o como diccionario: return { "nombre": nombre, "apellido": apellido }
# return Persona(nombre, apellido)
$$ LANGUAGE plpythonu;
38. PlPython: Procedimientos almacenados
Devolver multiples tipos escalares o compuestos:
CREATE TYPE saludo AS (
mensaje TEXT, -- hola
a_quien TEXT -- mundo
);
CREATE FUNCTION saludar (mensaje TEXT)
RETURNS SETOF saludo
AS $$
# devolver una tupla conteniendo lista de tipos
# todas las otras combinaciones son posibles
return ( [ mensaje, "Mundo" ], [ mensaje, "PostgreSQL" ], [ mensaje,
"PL/Python" ] )
##for a_quien in [ "Mundo","PostgreSQL","PL/Python"]:
## yield ( mensaje, a_quien )
$$ LANGUAGE plpythonu;
39. PlPython: Procedimientos almacenados
Disparadores (triggers), recibe diccionario TD:
TD["new"]: valores nuevos de la fila afectada
TD["old"]: valores viejos de la fila afectada
TD["event"]: tipo de evento "INSERT",
"UPDATE", "DELETE", o "UNKNOWN"
TD["when"]: momento en que se ejecutó:
"BEFORE" (antes del commit), "AFTER"
(despues del commit), o "UNKNOWN"
TD["args"]: argumentos adicionales
Si TD["when"] es BEFORE: se puede devolver
None or "OK", "SKIP o "MODIFY"
40. PlPython: Procedimientos almacenados
Acceso a la base de datos: módulo plpy
plpy.error y plpy.fatal disparan una excepción
python, si no se controla, se propaga y causa que
la transacción se aborte. Equivalente a llamar raise
plpy.ERROR(msg) y raise plpy.FATAL(msg)
plpy.debug(msg), plpy.log(msg), plpy.info(msg),
plpy.notice(msg), plpy.warning(msg) informan
mensajes de distinta prioridad
plpy.execute(sql, limite): ejecutar consultas
plpy.prepare(sql, [tipos]): preparar consultas
41. PlPython: Procedimientos almacenados
Ejecutar consulta con execute:
se obtienen las filas recorriendo el resultado por
numero de fila y nombre de columna
nrows: devuelve cantidad de filas
status: estado interno
rv = plpy.execute("SELECT * FROM mi_tabla", 5)
for fila in rv:
print fila['columna']
42. PlPython: Procedimientos almacenados
Preparar y ejecutar consulta con execute:
# preparo el plan
plan = plpy.prepare("SELECT apellido FROM usuario WHERE nombre = $1
AND casado = $2 ", [ "text", "boolean" ])
# ejecuto el plan con los parámetros
rv = plpy.execute(plan, [ "Mariano", True ], 5)
CREATE FUNCTION usar_plan() RETURNS trigger AS $$
if SD.has_key("plan"):
plan = SD["plan"] # está el plan, lo reutilizo
else:
# no esta el plan, lo creo y almaceno
plan = plpy.prepare("SELECT 1")
SD["plan"] = plan
# continua la función...
$$ LANGUAGE plpythonu;
43. PlPython: Procedimientos almacenados
Preparar y ejecutar consulta con execute:
# preparo el plan
plan = plpy.prepare("SELECT apellido FROM usuario WHERE nombre = $1
AND casado = $2 ", [ "text", "boolean" ])
# ejecuto el plan con los parámetros
rv = plpy.execute(plan, [ "Mariano", True ], 5)
CREATE FUNCTION usar_plan() RETURNS trigger AS $$
if SD.has_key("plan"):
plan = SD["plan"] # está el plan, lo reutilizo
else:
# no esta el plan, lo creo y almaceno
plan = plpy.prepare("SELECT 1")
SD["plan"] = plan
# continua la función...
$$ LANGUAGE plpythonu;
44. PlPython: Procedimientos almacenados
Ejemplo: analizador de direcciones
CREATE TYPE direccion AS (
calle1 TEXT,
calle2 TEXT,
altura INTEGER
);
CREATE OR REPLACE FUNCTION analizar_dir(dir text)
RETURNS direccion AS
$BODY$
def is_numeric(x):
return not [y for y in x if not '0'<=x<='9']
...
return nombres[0], nombres[1], altura and int(altura[-6:]) or None
$BODY$
LANGUAGE 'plpythonu' IMMUTABLE;
select calle1, calle2, altura from analizar_dir('balcarce 50 esquina rivadavia')
45. Documentación y Ayuda
Documentación Oficial: http://docs.python.org/
Libro Python para todos
Python Argentina: Aprendiendo Python