(estoy usando Python 2.7) La documentación de Python indica que se puede pasar una asignación al dict orden interna y va a copiar que la cartografía en el nuevo dict:ABC Python: registrar vs subclases
http://docs.python.org/library/stdtypes.html#mapping-types-dict
tengo una clase que implementa el mapeo de ABC, pero fracasa:
import collections
class Mapping(object):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
collections.Mapping.register(Mapping)
dict(m)
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# TypeError: cannot convert dictionary update sequence element #0 to a sequence
sin embargo, si mis subclases de la clase collections.Mapping entonces funciona bien:
import collections
class Mapping(collections.Mapping):
def __init__(self, dict={}): self.dict=dict
def __iter__(self): return iter(self.dict)
def __iter__(self): return iter(self.dict)
def __len__(self): return len(self.dict)
def __contains__(self, value): return value in self.dict
def __getitem__(self, name): return self.dict[name]
m=Mapping({5:5})
dict(m)
# {5: 5}
Pensé que el objetivo del ABC era permitir que el registro funcionara de la misma manera que la creación de subclases (para isinstance y issubclass de todos modos). Entonces, ¿qué hay aquí?
Gracias! Eso fue informativo. No quería hacer una subclase porque no quiero los métodos particulares "gratis" que obtienes cuando haces una subclase. Pensé que había cubierto mi clase lo suficiente como para poder lanzarla a un dict, pero estaba equivocado. Gracias de nuevo. –
@Eric, ¡de nada! El método específico que omitió con el propósito de ingresar (o actualizar) un dict con una instancia de su clase es 'keys' - línea 1411 de http://svn.python.org/view/python/trunk/Objects /dictobject.c?annotate=81029 - 'if (PyObject_HasAttrString (arg," keys "))' - así es como 'dict' descubre si se está pasando un mapeo o un iterable de pares (en el primer caso, línea 1567 , usará 'PyMapping_Keys' & c). Por cierto, inocuo pero superfluo, definiste '__iter__' dos veces. –
En lo que respecta a la clase Mapeo, ¿significa eso que un Mapeo adecuado debe tener todos los métodos de Mapeo, incluso los libres? Yo pensaría que sí, ya que se esperaban llaves para Dict. ¿O es que ese dict podría haber usado iter para obtener las llaves? –