jueves, 16 de abril de 2015

Tuplas a medida con namedtuple


namedtuple del módulo collections se utiliza para definir subclases de la clase tuple, que permiten crear tuplas a medida a los programadores. El nombre del nuevo tipo de tupla será el que se indique en el primer argumento y constará de los campos que se incluyan en la lista del segundo argumento:

namedtuple(typename, field_names, verbose=False, rename=False)


Si el argumento rename es True los nombres de campos que no sean válidos serán sustituidos, automáticamente, por nombres posicionales ('_1', '_2', ...). También, si el argumento verbose es True la definición de la clase será impresa después de que se construya. Esta última opción que tiende a desaparecer se obtiene también mediante el atributo _source.

Los nombres de los campos pueden contener caracteres alfabéticos, numéricos y guiones bajos; y no pueden comenzar con caracteres numéricos o guiones bajos, ni pueden ser, lógicamente, palabras reservadas del lenguaje Python.

import collections

# Crear un nuevo tipo de tupla para contener datos
# de elementos químicos

elemento = collections.namedtuple('elemento', 
                                  ['nombre', 'simbolo', 'numato'])

# Crear un nuevo objeto del tipo elemento, 
# con datos del Azufre

elem = elemento('Azufre', 'S', 16)

# Mostrar información del objeto anterior

print(elem.nombre, elem.simbolo, elem.numato)  # Azufre S 16
print(elem[0], elem[1], elem[2])  # Azufre S 16
print(elem)  # elemento(nombre='Azufre', simbolo='S', numato=16)

# Conocer de qué tipo es el objeto 'elem' 

print(type(elem))  # 

# Mostrar la definición de la subclase 'elem'

print(elem._source)

# Mostrar los nombres de campos de la subclase 'elem'

print(elem._fields)  
# nombres de campos: ('nombre', 'simbolo', 'numato')

# Sustituir los valores actuales

elem = elem._replace(nombre='Carbono', simbolo='C', numato=6)

# Mostrar información

print(elem.nombre)  # 'Carbono'

# Mostrar tipo de diccionario con los campos ordenados
# como en una tupla

print(elem._asdict())

# Obtener el valor del campo indicado

print(getattr(elem, 'simbolo'))  # 'C'

# Crear otro tipo nuevo para contener coordenadas de
# un plano y color

coordenada = collections.namedtuple('coordenada', 
                                    ['x', 'y', 'color'])
coord = coordenada(12, 53, 'blue')

# Mostrar valores 

print('x=', coord.x)
print('y=', coord.y)
print('color=', coord.color)

x, y, color = coord
print(x, y, color)


Ir al índice del tutorial de Python