Converter o tipo de função incorporado no tipo de método (no Python 3)
Considere uma função simples como
def increment(self):
self.count += 1
que é executado através do Cython e compilado em um módulo de extensão. Suponha agora que eu gostaria de fazer desta função um método em uma classe. Por exemplo:
class Counter:
def __init__(self):
self.count = 0
from compiled_extension import increment
Counter.increment = increment
Agora isso não funcionará, pois a convenção de chamada no nível C será quebrada. Por exemplo:
>>> c = Counter()
>>> c.increment()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: increment() takes exactly one argument (0 given)
Mas no Python 2, podemos converter a função em um método não vinculado fazendo:
Counter.increment = types.MethodType(increment, None, Counter)
Como posso realizar a mesma coisa no Python 3?
Uma maneira simples é usar um empacotador fino:
from functools import wraps
def method_wraper(f):
def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wraps(f)(wrapper)
Counter.increment = method_wrapper(increment)
Existe uma maneira mais eficiente de fazer isso?