Я много использую оболочку 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)
)
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
Если вы хотите использовать метакласс, то да, это возможно:
class ror(type):
@classmethod
def __ror__(cls, obj):
print(obj)
class Foo(metaclass=ror):
pass
'a' | Foo
# a
dump
- это экземпляр_dump
, для которогоself.opt
определен какFalse
, но__call__
возвращает другой экземпляр_dump
сself.opt
определенным какTrue
. Затем python вызывает__ror__
для только что созданного и возвращенного экземпляра.