clase de python que actúa como mapeo para** desempaquetar
class mapping (2)
Sin crear subclases de dict, ¿qué debe considerarse una clase como un mapeo para que pueda pasarse a un método con **
from abc import ABCMeta
class uobj:
__metaclass__ = ABCMeta
uobj.register(dict)
def f(**k): return k
o = uobj()
f(**o)
# outputs: f() argument after ** must be a mapping, not uobj
Al menos hasta el punto en que arroja errores de falta de funcionalidad de mapeo, por lo que puedo comenzar a implementar.
Revisé la emulación de tipos de contenedores, pero la simple definición de métodos mágicos no tiene ningún efecto, y el uso de ABCMeta para anular y registrarlo como un dict valida las aserciones como subclase, pero falla isinstance (o, dict). Idealmente, ni siquiera quiero usar ABCMeta.
Los métodos __getitem__()
y keys()
serán suficientes:
>>> class D:
def keys(self):
return [''a'', ''b'']
def __getitem__(self, key):
return key.upper()
>>> def f(**kwds):
print kwds
>>> f(**D())
{''a'': ''A'', ''b'': ''B''}
Si está intentando crear un Mapeo, no solo cumple los requisitos para pasar a una función, entonces debería heredar de las collections.Mapping
. Asignación. Como se describe en la documentation , debe implementar solo:
__getitem__
__len__
__iter__
El Mixin implementará todo lo demás para usted: __contains__
, keys
, items
, values
, get
, __eq__
, y __ne__
.