Search code examples
pythonclassmappingargument-unpacking

Class that acts as mapping for **unpacking


Without subclassing dict, what would a class need to be considered a mapping so that it can be passed to a method with **.

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

At least to the point where it throws errors of missing functionality of mapping, so I can begin implementing.

I reviewed emulating container types but simply defining magic methods has no effect, and using ABCMeta to override and register it as a dict validates assertions as subclass, but fails isinstance(o, dict). Ideally, I dont even want to use ABCMeta.


Solution

  • The __getitem__() and keys() methods will suffice:

    >>> 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'}