Эквивалент Ruby Mash в Python? - PullRequest
       3

Эквивалент Ruby Mash в Python?

4 голосов
/ 05 октября 2010

в Ruby есть удивительная библиотека, называемая Mash , которая является хешем, но благодаря умелому использованию missing_method может конвертировать:

object['property']

в

object.property

Это действительно полезно для издевательств.Кто-нибудь знает подобные вещи в Python?

Ответы [ 4 ]

7 голосов
/ 05 октября 2010

Это абсолютно необходимо, чтобы вы основали это на диктовке?Объекты Python могут динамически приобретать атрибуты с очень небольшим дополнительным подключением:

>>> class C(object): pass
...
>>> z = C()
>>> z.blah = "xyzzy"
>>> dir(z)
['__class__', '__delattr__', '__dict__', ... '__weakref__', 'blah']
4 голосов
/ 05 октября 2010

Является ли __getitem__ тем, что вы ищете?

class C:
   def __init__(self):
      self.my_property = "Hello"

   def __getitem__(self, name):
      return getattr(self, name)

c = C()
print c['my_property']  # Prints "Hello"

или вы ищете обратную, через __getattr__?

class D(dict):
   def __getattr__(self, name):
      return self[name]

d = D()
d['x'] = "Hello"
print d.x  # Prints "Hello"

( Редактировать : Как любезно указывает Пол Макгуайр в комментариях, этот код демонстрирует только голое полное решение.)

1 голос
/ 06 июля 2011

Обязательно ли основывать это на диктовке?

Да, если вы хотите обрабатывать его как список предметов, не злоупотребляя __dict__.

Ниже приводится мой старый ответ на вопрос о Маше.Он обеспечивает значение по умолчанию, по умолчанию это может быть метод или объект, если это объект, он будет клонироваться глубоко ( не просто горячая ссылка), если он используется более одного раза.

Ион выставляет свои простые значения ключей как .key:

def Map(*args, **kwargs):
    value = kwargs.get('_default', None)
    if kwargs.has_key('_default'):  del kwargs['_default']

 # CONSIDER  You may want to look at the collections.defaultdict class.
 #      It takes in a factory function for default values.
 #
 # You can also implement your class by overriding the __missing__ method
 #      of the dict class, rather than overriding the __getitem__.
 #
 # Both were added in Python 2.5 according to the documentation.

    class _DefMap(dict):
        'But CONSIDER http://pypi.python.org/pypi/bunch/1.0.0 '

        def __init__(self, *a, **kw):
            dict.__init__(self, *a, **kw)
            self.__dict__ = self

        def __getitem__(self, key):

            if not self.has_key(key):

                if hasattr(value, '__call__'):
                    self[key] = value(key)
                else:
                    self[key] = copy.deepcopy(value)

            return dict.__getitem__(self, key)

    return _DefMap(*args, **kwargs)
0 голосов
/ 14 сентября 2015

Смотрите здесь https://pypi.python.org/pypi/mash.Также вы можете конвертировать dict в объект mash.

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