from dataclasses import dataclass import functools import typing @dataclass(frozen=True) class Cursed[T ,R]: fun: typing.Callable[[T], R] @typing.overload def __ror__(self, arg: T, /) -> R: ... @typing.overload def __ror__(self, arg: list[T], /) -> list[R]: ... def __ror__(self, arg): if isinstance(arg, list): return [self(ai) for ai in arg] return self.fun(arg) def __call__(self, arg: T) -> R: return self.fun(arg) def __repr__(self) -> str: return f"" #@functools.wraps def curse(f): return Cursed(f) if __name__ == '__main__': abs = curse(abs) print(abs) print(abs(-3)) print(-3 | abs) print([1, -3, 9, -27] | abs)