source: trunk/traducidos/stdlib.rst @ 224

Revision 224, 10.6 KB checked in by facundobatista, 3 months ago (diff)

Actualizado a lo último último.

Pequeño paseo por la Biblioteca Estándar

Interfaz al sistema operativo

El módulo :mod:`os` provee docenas de funciones para interactuar con el sistema operativo:

System Message: ERROR/3 (<string>, line 13); backlink

Unknown interpreted text role "mod".
>>> import os
>>> os.getcwd()      # devuelve el directorio de trabajo actual
'C:\\Python34'
>>> os.chdir('/server/accesslogs')   # cambia el directorio de trabajo
>>> os.system('mkdir today')   # ejecuta el comando 'mkdir' en el sistema
0

Asegurate de usar el estilo import os en lugar de from os import *. Esto evitará que :func:`os.open` oculte a la función integrada :func:`open`, que trabaja bastante diferente.

System Message: ERROR/3 (<string>, line 23); backlink

Unknown interpreted text role "func".

System Message: ERROR/3 (<string>, line 23); backlink

Unknown interpreted text role "func".

System Message: ERROR/3 (<string>, line 27)

Unknown directive type "index".

.. index:: builtin: help

Las funciones integradas :func:`dir` y :func:`help` son útiles como ayudas interactivas para trabajar con módulos grandes como :mod:`os`:

System Message: ERROR/3 (<string>, line 29); backlink

Unknown interpreted text role "func".

System Message: ERROR/3 (<string>, line 29); backlink

Unknown interpreted text role "func".

System Message: ERROR/3 (<string>, line 29); backlink

Unknown interpreted text role "mod".
>>> import os
>>> dir(os)
<devuelve una lista de todas las funciones del módulo>
>>> help(os)
<devuelve un manual creado a partir de las documentaciones del módulo>

Para tareas diarias de administración de archivos y directorios, el módulo :mod:`shutil` provee una interfaz de más alto nivel que es más fácil de usar:

System Message: ERROR/3 (<string>, line 38); backlink

Unknown interpreted text role "mod".
>>> import shutil
>>> shutil.copyfile('datos.db', 'archivo.db')
>>> shutil.move('/build/executables', 'dir_instalac')

Comodines de archivos

El módulo :mod:`glob` provee una función para hacer listas de archivos a partir de búsquedas con comodines en directorios:

System Message: ERROR/3 (<string>, line 51); backlink

Unknown interpreted text role "mod".
>>> import glob
>>> glob.glob('*.py')
['primes.py', 'random.py', 'quote.py']

Argumentos de linea de órdenes

Los programas frecuentemente necesitan procesar argumentos de linea de órdenes. Estos argumentos se almacenan en el atributo argv del módulo :mod:`sys` como una lista. Por ejemplo, la siguiente salida resulta de ejecutar python demo.py uno dos tres en la línea de órdenes:

System Message: ERROR/3 (<string>, line 63); backlink

Unknown interpreted text role "mod".
>>> import sys
>>> print(sys.argv)
['demo.py', 'uno', 'dos', 'tres']

El módulo :mod:`getopt` procesa sys.argv usando las convenciones de la función de Unix :func:`getopt`. El módulo :mod:`argparse` provee un procesamiento más flexible de la linea de órdenes.

System Message: ERROR/3 (<string>, line 72); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 72); backlink

Unknown interpreted text role "func".

System Message: ERROR/3 (<string>, line 72); backlink

Unknown interpreted text role "mod".

Redirección de la salida de error y finalización del programa

El módulo :mod:`sys` también tiene atributos para stdin, stdout, y stderr. Este último es útil para emitir mensajes de alerta y error para que se vean incluso cuando se haya redireccionado stdout:

System Message: ERROR/3 (<string>, line 82); backlink

Unknown interpreted text role "mod".
>>> sys.stderr.write('Alerta, archivo de log no encontrado\n')
Alerta, archivo de log no encontrado

La forma más directa de terminar un programa es usar sys.exit().

Coincidencia en patrones de cadenas

El módulo :mod:`re` provee herramientas de expresiones regulares para un procesamiento avanzado de cadenas. Para manipulación y coincidencias complejas, las expresiones regulares ofrecen soluciones concisas y optimizadas:

System Message: ERROR/3 (<string>, line 97); backlink

Unknown interpreted text role "mod".
>>> import re
>>> re.findall(r'\bt[a-z]*', 'tres felices tigres comen trigo')
['tres', 'tigres', 'trigo']
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'gato en el el sombrero')
'gato en el sombrero'

Cuando se necesita algo más sencillo solamente, se prefieren los métodos de las cadenas porque son más fáciles de leer y depurar.

>>> 'te para tos'.replace('tos', 'dos')
'te para dos'

Matemática

El módulo :mod:`math` permite el acceso a las funciones de la biblioteca C subyacente para la matemática de punto flotante:

System Message: ERROR/3 (<string>, line 120); backlink

Unknown interpreted text role "mod".
>>> import math
>>> math.cos(math.pi / 4)
0.70710678118654757
>>> math.log(1024, 2)
10.0

El módulo :mod:`random` provee herramientas para realizar selecciones al azar:

System Message: ERROR/3 (<string>, line 129); backlink

Unknown interpreted text role "mod".
>>> import random
>>> random.choice(['manzana', 'pera', 'banana'])
'manzana'
>>> random.sample(range(100), 10)   # elección sin reemplazo
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33]
>>> random.random()    # un float al azar
0.17970987693706186
>>> random.randrange(6)    # un entero al azar tomado de range(6)
4

El proyecto SciPy <http://scipy.org> tiene muchos otros módulos para cálculos numéricos.

Acceso a Internet

Hay varios módulos para acceder a internet y procesar sus protocolos. Dos de los más simples son :mod:`urllib.request` para traer data de URLs y :mod:`smtplib` para mandar correos:

System Message: ERROR/3 (<string>, line 150); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 150); backlink

Unknown interpreted text role "mod".
>>> from urllib.request import urlopen
>>> for line in urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'):
...     if 'EST' in line or 'EDT' in line:  # buscamos la hora del este
...         print(line)
<BR>Nov. 25, 09:43:32 PM EST
>>> import smtplib
>>> server = smtplib.SMTP('localhost')
>>> server.sendmail('soothsayer@ejemplo.org', 'jcaesar@ejemplo.org',
... """To: jcaesar@ejemplo.org
... From: soothsayer@ejemplo.org
...
... Ojo al piojo.
... """)
>>> server.quit()

(Notá que el segundo ejemplo necesita un servidor de correo corriendo en la máquina local)

Fechas y tiempos

El módulo :mod:`datetime` ofrece clases para manejar fechas y tiempos tanto de manera simple como compleja. Aunque soporta aritmética sobre fechas y tiempos, el foco de la implementación es en la extracción eficiente de partes para manejarlas o formatear la salida. El módulo también soporta objetos que son conscientes de la zona horaria.

System Message: ERROR/3 (<string>, line 179); backlink

Unknown interpreted text role "mod".
>>> # las fechas son fácilmente construidas y formateadas
>>> from datetime import date
>>> hoy = date.today()
>>> hoy
datetime.date(2009, 7, 19)
>>> # nos aseguramos de tener la info de localización correcta
>>> import locale
>>> locale.setlocale(locale.LC_ALL, locale.getdefaultlocale())
'es_ES.UTF8'
>>> hoy.strftime("%m-%d-%y. %d %b %Y es %A. hoy es %d de %B.")
'07-19-09. 19 jul 2009 es domingo. hoy es 19 de julio.'
>>> # las fechas soportan aritmética de calendario
>>> nacimiento = date(1964, 7, 31)
>>> edad = hoy - nacimiento
>>> edad.days
14368

Compresión de datos

Los formatos para archivar y comprimir datos se soportan directamente con los módulos: :mod:`zlib`, :mod:`gzip`, :mod:`bz2`, :mod:`lzma`, :mod:`zipfile` y :mod:`tarfile`.

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 210); backlink

Unknown interpreted text role "mod".
>>> import zlib
>>> s = b'witch which has which witches wrist watch'
>>> len(s)
41
>>> t = zlib.compress(s)
>>> len(t)
37
>>> zlib.decompress(t)
b'witch which has which witches wrist watch'
>>> zlib.crc32(s)
226805979

Medición de rendimiento

Algunos usuarios de Python desarrollan un profundo interés en saber el rendimiento relativo de las diferentes soluciones al mismo problema. Python provee una herramienta de medición que responde esas preguntas inmediatamente.

Por ejemplo, puede ser tentador usar la característica de empaquetamiento y desempaquetamiento de las tuplas en lugar de la solución tradicional para intercambiar argumentos. El módulo :mod:`timeit` muestra rapidamente una modesta ventaja de rendimiento:

System Message: ERROR/3 (<string>, line 236); backlink

Unknown interpreted text role "mod".
>>> from timeit import Timer
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit()
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

En contraste con el fino nivel de granularidad del módulo :mod:`timeit`, los módulos :mod:`profile` y :mod:`pstats` proveen herramientas para identificar secciones críticas de tiempo en bloques de código más grandes.

System Message: ERROR/3 (<string>, line 247); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 247); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 247); backlink

Unknown interpreted text role "mod".

Control de calidad

Una forma para desarrollar software de alta calidad es escribir pruebas para cada función mientras se la desarrolla, y correr esas pruebas frecuentemente durante el proceso de desarrollo.

El módulo :mod:`doctest` provee una herramienta para revisar un módulo y validar las pruebas integradas en las cadenas de documentación (o docstring) del programa. La construcción de las pruebas es tan sencillo como cortar y pegar una ejecución típica junto con sus resultados en los docstrings. Esto mejora la documentación al proveer al usuario un ejemplo y permite que el módulo :mod:`doctest` se asegure que el código permanece fiel a la documentación:

System Message: ERROR/3 (<string>, line 261); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 261); backlink

Unknown interpreted text role "mod".
def promedio(valores):
    """Calcula la media aritmética de una lista de números.
    >>> print(promedio([20, 30, 70]))
    40.0
    """
    return sum(valores) / len(valores)
import doctest
doctest.testmod()   # valida automáticamente las pruebas integradas

El módulo :mod:`unittest` necesita más esfuerzo que el módulo :mod:`doctest`, pero permite que se mantenga en un archivo separado un conjunto más comprensivo de pruebas:

System Message: ERROR/3 (<string>, line 280); backlink

Unknown interpreted text role "mod".

System Message: ERROR/3 (<string>, line 280); backlink

Unknown interpreted text role "mod".
import unittest
class TestFuncionesEstadisticas(unittest.TestCase):
    def test_promedio(self):
        self.assertEqual(promedio([20, 30, 70]), 40.0)
        self.assertEqual(round(promedio([1, 5, 7]), 1), 4.3)
        self.assertRaises(ZeroDivisionError, promedio, [])
        self.assertRaises(TypeError, promedio, 20, 30, 70)
unittest.main() # llamarlo de la linea de comandos ejecuta todas las pruebas

Las pilas incluidas

Python tiene una filosofía de "pilas incluidas". Esto se ve mejor en las capacidades robustas y sofisticadas de sus paquetes más grandes. Por ejemplo:

  • Los módulos :mod:`xmlrpc.client` y :mod:`xmlrpc.server` hacen que implementar llamadas a procedimientos remotos sea una tarea trivial. A pesar de los nombres de los módulos, no se necesita conocimiento directo o manejo de XML.

    System Message: ERROR/3 (<string>, line 305); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 305); backlink

    Unknown interpreted text role "mod".

  • El paquete :mod:`email` es una biblioteca para manejar mensajes de mail, incluyendo MIME y otros mensajes basados en RFC 2822. Al contrario de :mod:`smtplib` y :mod:`poplib` que en realidad envían y reciben mensajes, el paquete :mod:`email` tiene un conjunto de herramientas completo para construir y decodificar estructuras complejas de mensajes (incluyendo adjuntos) y para implementar protocolos de cabecera y codificación de Internet.

    System Message: ERROR/3 (<string>, line 310); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 310); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 310); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 310); backlink

    Unknown interpreted text role "mod".

  • Los paquetes :mod:`xml.dom` y :mod:`xml.sax` proveen un robusto soporte para analizar este popular formato de intercambio de datos. Asimismo, el módulo :mod:`csv` soporta lecturas y escrituras directas en un formato común de base de datos. Juntos, estos módulos y paquetes simplifican enormemente el intercambio de datos entre aplicaciones Python y otras herramientas.

    System Message: ERROR/3 (<string>, line 318); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 318); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 318); backlink

    Unknown interpreted text role "mod".

  • Se soporta la internacionalización a través de varios módulos, incluyendo :mod:`gettext`, :mod:`locale`, y el paquete :mod:`codecs`.

    System Message: ERROR/3 (<string>, line 324); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 324); backlink

    Unknown interpreted text role "mod".

    System Message: ERROR/3 (<string>, line 324); backlink

    Unknown interpreted text role "mod".

Note: See TracBrowser for help on using the repository browser.