Я сделал простой пакет для решения проблемы
Установка
Мастер ветвь
pip install git+https://github.com/ferrine/biwrap
Последний выпуск
pip install biwrap
Обзор
Некоторые оболочки могут иметь необязательные аргументы, и мы часто хотим избегать вызовов @wrapper()
и использовать вместо них @wrapper
.
Это работает для простой оболочки
import biwrap
@biwrap.biwrap
def hiwrap(fn, hi=True):
def new(*args, **kwargs):
if hi:
print('hi')
else:
print('bye')
return fn(*args, **kwargs)
return new
Определенная оболочка может использоваться в обоихспособы
@hiwrap
def fn(n):
print(n)
fn(1)
#> hi
#> 1
@hiwrap(hi=False)
def fn(n):
print(n)
fn(1)
#> bye
#> 1
biwrap
также работает для связанных методов
class O:
@hiwrap(hi=False)
def fn(self, n):
print(n)
O().fn(1)
#> bye
#> 1
Также поддерживаются методы / свойства класса
class O:
def __init__(self, n):
self.n = n
@classmethod
@hiwrap
def fn(cls, n):
print(n)
@property
@hiwrap(hi=False)
def num(self):
return self.n
o = O(2)
o.fn(1)
#> hi
#> 1
print(o.num)
#> bye
#> 2
Функция типа вызова тоже в порядке
def fn(n):
print(n)
fn = hiwrap(fn, hi=False)
fn(1)
#> bye
#> 1