Python __ror__ без инициализации класса

1

Я много использую оболочку ipython и решил сделать более удобной для ввода некоторую функцию обертки. Цель состоит в том, чтобы набрать AnObject | dump AnObject | dump вместо dump(AnObject). Это только внутри оболочки ipython и в dev. Чтобы упростить ввод.

Я придумал это до сих пор:

class _dump:
    def __ror__(_, obj):
        print(obj)
dump = _dump()
d = {'test': 123}
d | dump

который выводит {'test': 123}

Крошечная вещь меня раздражает. Есть ли способ сделать это без инициализации класса после определения? И как бонус, можно ли принять и | dump | dump, а также как функцию (| dump(opt=True))

Теги:

2 ответа

1
Лучший ответ
class _dump:
    def __init__(self, opt=False):
        self.opt = opt
    def __ror__(self, obj):
        if self.opt:
            print("Opt is TRUE!")
        print(obj)
    def __call__(self, *args, **kwds):
        return _dump(*args, **kwds)

dump = _dump()

>>> 'a' | dump 
a
>>> 'a' | dump(opt=True)
Opt is TRUE!
a
  • 0
    Очень хорошо! Вы можете это объяснить? Сначала вызывается call , затем возвращается сам. Но я чувствую, что новый вызов должен потерять информацию, которую он должен назвать ror ..
  • 0
    dump - это экземпляр _dump , для которого self.opt определен как False , но __call__ возвращает другой экземпляр _dump с self.opt определенным как True . Затем python вызывает __ror__ для только что созданного и возвращенного экземпляра.
Показать ещё 1 комментарий
2

Если вы хотите использовать метакласс, то да, это возможно:

class ror(type):
     @classmethod
     def __ror__(cls, obj):
         print(obj)

class Foo(metaclass=ror):
    pass

'a' | Foo

#  a

Ещё вопросы

Сообщество Overcoder
Наверх
Меню