класс python, который действует как отображение для ** распаковки - PullRequest
57 голосов
/ 22 декабря 2011

Без подкласса dict, какой класс нужно считать отображением, чтобы его можно было передать в метод с **

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

По крайней мере до такой степени, что он выбрасывает ошибки отсутствующей функциональностисопоставления, так что я могу начать реализацию.

Я рассмотрел эмуляцию типов контейнеров, но простое определение магических методов не имеет никакого эффекта, и использование ABCMeta для переопределения и регистрации его как dict проверяет утверждения как подкласс, но не дает экземпляра (Дик).В идеале я даже не хочу использовать ABCMeta.

Ответы [ 2 ]

76 голосов
/ 22 декабря 2011

Методы __getitem__() и keys() будут достаточны:

>>> 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'}
22 голосов
/ 23 декабря 2011

Если вы пытаетесь создать сопоставление - а не просто удовлетворить требования для передачи в функцию - тогда вам действительно следует наследовать от collections.Mapping. Как описано в документации , вам нужно реализовать просто:

__getitem__
__len__
__iter__

Mixin выполнит все остальное за вас: __contains__, keys, items, values, get, __eq__ и __ne__.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...