python class mapping argument-unpacking

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__ .