69 votes

classe python servant de mappage pour ** décompresser

Sans sous-classement dict, ce qui serait une classe doit être considérée comme une cartographie de sorte qu'il peut être transmis à une méthode **

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

Au moins jusqu'au moment où il jette les erreurs de manque des fonctionnalités de cartographie, afin que je puisse commencer à mettre en œuvre.

J'ai passé en revue l'émulation types de conteneurs, mais il suffit de définir les méthodes magiques n'a aucun effet, et à l'aide de ABCMeta de modifier et l'enregistrer comme dict valide les assertions sous-classe, mais ne parvient pas isinstance(o, dict). Idéalement, je n'ai pas même envie d'utiliser ABCMeta.

94voto

Raymond Hettinger Points 50330

Les méthodes __getitem __ () et keys () suffiront:

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

32voto

Neil G Points 7028

Si vous essayez de créer un Mappage non seulement satisfaire les conditions pour le passage à une fonction, alors vous devriez vraiment hériter d' collections.Mapping. Comme décrit dans la documentation, vous devez mettre en œuvre:

__getitem__
__len__
__iter__
__contains__

Le Mixin mettra en œuvre tout le reste pour vous: __contains__, keys, items, values, get, __eq__, et __ne__.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X