Subsecciones

12 Módulos nuevos, mejorados y abandonados

Como es habitual, la biblioteca estándar de Python sufrió mejoras y corrección de errores. He aquí una lista, incompleta, de los cambios más notables, por orden alfabético del nombre del módulo afectado. En el fichero Misc/NEWS del árbol de las fuentes una lista más exhaustiva de los cambios y en los registros de CVS están todos los detalles.

12.1 cookielib

La biblioteca cookielib permite la gestión en el lado del cliente de cookies (galletas) HTTP, a imagen del módulo Cookie de gestión de cookies del lado del servidor. Las cookies se guardan en tarros de cookies; la biblioteca almacena transparentemente las cookies ofrecidas por el servidor web al conectarse al servidor. Como en los navegadores normales, hay un objeto de política que controla si se aceptan o no las cookies.

Para guardar las cookies entre sesiones, se proporcionan dos implementaciones de tarros de cookies: Una almacena las cookies en el formato Netscape, para que las aplicaciones puedan utilizar los ficheros de cookies de Mozilla o Lynx, y otra que almacena las cookies en el mismo formato que la biblioteca de Perl libwww.

Se ha cambiado el módulo urllib2 para interactuar con cookielib: HTTPCookieProcessor gestiona un tarro de cookies que se utiliza al acceder a URLs. (Contribución de John J. Lee.)

12.2 doctest

El módulo doctest sufrió una considerable refactorización gracias a Edward Loper y Tim Peters. Las pruebas pueden ser tan sencillas como ejecutar doctest.testmod(), pero las refactorizaciones permiten adaptar el funcionamiento del módulo de diversas maneras.

La nueva clase DocTestFinder extrae las pruebas de las cadenas de documentación de un objeto dado:

def f (x, y):
    """>>> f(2,2)
4
>>> f(3,2)
6
    """
    return x*y

buscador = doctest.DocTestFinder()

# Obtener la lista de instancias de DocTest 
pruebas = buscador.find(f)

Entonces, la nueva clase DocTestRunner ejecuta las pruebas individuales y puede producir un resumen de los resultados:

ejecutor = doctest.DocTestRunner()
for t in tests:
    tried, failed = ejecutor.run(t)
    
ejecutor.summarize(verbose=1)

El ejemplo produce la siguiente salida:

1 items passed all tests:
   2 tests in f
2 tests in 1 items.
2 passed and 0 failed.
Test passed.

DocTestRunner usa una instancia de la clase OutputChecker para comparar la salida esperada con la salida real. Esta clase admite diferentes indicadores que personalizan su comportamiento; los usuarios ambiciosos también pueden escribir una subclase de OutputChecker completamente nueva.

El comprobador de salida predefinido ofrece características muy útiles. Por ejemplo, con el indicador de opción doctest.ELLIPSIS, los puntos suspensivos ("...") de la entrada pueden coincidir con cualquier subcadena, facilitando acomodar salidas que varían ligeramente:

def o (n):
    """>>> o(1)
<__main__.C instance at 0x...>
>>>
"""

Hay otra cadena, "<BLANKLINE>", que coincide con una línea en blanco:

def p (n):
    """>>> p(1)
<BLANKLINE>
>>>
"""

Otra posibilidad nueva es la de producir una presentación tipo diff de la salida especificando los indicadores de opción doctest.REPORT_UDIFF (unificados), doctest.REPORT_CDIFF (de contexto) o doctest.REPORT_NDIFF (tipo delta). Por ejemplo:

def g (n):
    """>>> g(4)
bajel
pirata
que
llaman
>>>"""
    L = 'bajel pirata que llaman por su bravura el temido'.split()
    for palabra in L[:n]:
        print palabra

Al ejecutar esto especificando doctest.REPORT_UDIFF, se obtiene el siguiente resultado:

**********************************************************************
File ``t.py'', line 15, in g
Failed example:
    g(4)
Differences (unified diff with -expected +actual):
    @@ -2,3 +2,3 @@
     pirata
     que
    -laman
    +llaman
**********************************************************************

Consultar en Acerca de este documento... información para sugerir cambios.