No se puede utilizar la misma aplicación que el objeto resultado de os.stat() y otros. Sin embargo, Python 2.6 tiene una nueva función de fábrica que crea un tipo de datos similar llamado tupla con nombre. Una tupla nombrada es una tupla cuyas ranuras también pueden ser direccionadas por nombre. La tupla nombrada no debería requerir más memoria, según la documentación, que una tupla normal, ya que no tienen un diccionario por instancia. La firma de la función de fábrica es:
collections.namedtuple(typename, field_names[, verbose])
El primer argumento especifica el nombre del nuevo tipo, el segundo argumento es una cadena (espacio o separado por comas) que contiene los nombres de campo y, por último, si es prolijo cierto, la la función de fábrica también imprimirá la clase generada.
Ejemplo
Suponga que tiene una tupla que contiene un nombre de usuario y contraseña.Para tener acceso al nombre de usuario que consigue el artículo en la posición cero y se accede a la contraseña en la posición uno:
credential = ('joeuser', 'secret123')
print 'Username:', credential[0]
print 'Password:', credential[1]
No hay nada malo con este código, pero la tupla no es auto-documentado. Debe buscar y leer la documentación sobre el posicionamiento de los campos en la tupla. Aquí es donde la tupla nombrada puede venir al rescate. Podemos recodificar el ejemplo anterior de la siguiente manera:
import collections
# Create a new sub-tuple named Credential
Credential = collections.namedtuple('Credential', 'username, password')
credential = Credential(username='joeuser', password='secret123')
print 'Username:', credential.username
print 'Password:', credential.password
Si está interesado de lo que el código es el siguiente para el tipo de credenciales de nueva creación puede agregar detallado = True a la lista de argumentos al crear el tipo, en este caso particular obtenemos el siguiente resultado:
import collections
Credential = collections.namedtuple('Credential', 'username, password', verbose=True)
class Credential(tuple):
'Credential(username, password)'
__slots__ =()
_fields = ('username', 'password')
def __new__(_cls, username, password):
return _tuple.__new__(_cls, (username, password))
@classmethod
def _make(cls, iterable, new=tuple.__new__, len=len):
'Make a new Credential object from a sequence or iterable'
result = new(cls, iterable)
if len(result) != 2:
raise TypeError('Expected 2 arguments, got %d' % len(result))
return result
def __repr__(self):
return 'Credential(username=%r, password=%r)' % self
def _asdict(t):
'Return a new dict which maps field names to their values'
return {'username': t[0], 'password': t[1]}
def _replace(_self, **kwds):
'Return a new Credential object replacing specified fields with new values'
result = _self._make(map(kwds.pop, ('username', 'password'), _self))
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
def __getnewargs__(self):
return tuple(self)
username = _property(_itemgetter(0))
password = _property(_itemgetter(1))
la tupla llamado no sólo proporciona acceso a los campos de nombre, sino también contiene funciones auxiliares tales como la función _Asegúrese() que ayuda a la creación de una instancia de credenciales de una secuencia o iterable. Por ejemplo:
cred_tuple = ('joeuser', 'secret123')
credential = Credential._make(cred_tuple)
La documentación de la biblioteca de Python para namedtuple tiene más información y ejemplos de código, por lo que sugiere que take a peek.