Konvertieren des eingebauten Funktionstyps in einen Methodentyp (in Python 3)
Betrachten Sie eine einfache Funktion wie
def increment(self):
self.count += 1
Das wird über Cython ausgeführt und zu einem Erweiterungsmodul kompiliert. Angenommen, ich möchte diese Funktion jetzt zu einer Methode für eine Klasse machen. Zum Beispiel:
class Counter:
def __init__(self):
self.count = 0
from compiled_extension import increment
Counter.increment = increment
Dies wird jetzt nicht funktionieren, da die Aufrufkonvention auf der C-Ebene unterbrochen wird. Zum Beispiel:
>>> c = Counter()
>>> c.increment()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: increment() takes exactly one argument (0 given)
In Python 2 können wir die Funktion folgendermaßen in eine ungebundene Methode konvertieren:
Counter.increment = types.MethodType(increment, None, Counter)
Wie kann ich dasselbe in Python 3 erreichen?
Eine einfache Möglichkeit besteht darin, eine dünne Hülle zu verwenden:
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)
Gibt es eine effizientere Möglichkeit, dies zu tun?