Beizen einer statischen Methode in Python
Ich habe versucht, ein Objekt auszuwählen, das Verweise auf statische Klassenmethoden enthält. Essiggurke scheitert (zum Beispiel ammodule.MyClass.foo
) besagt, dass es nicht gebeizt werden kann, alsmodule.foo
ist nicht vorhanden.
Ich habe die folgende Lösung gefunden, die ein Wrapper-Objekt verwendet, um die Funktion beim Aufruf zu lokalisieren und die Containerklasse und den Funktionsnamen zu speichern:
class PicklableStaticMethod(object):
"""Picklable version of a static method.
Typical usage:
class MyClass:
@staticmethod
def doit():
print "done"
# This cannot be pickled:
non_picklable = MyClass.doit
# This can be pickled:
picklable = PicklableStaticMethod(MyClass.doit, MyClass)
"""
def __init__(self, func, parent_class):
self.func_name = func.func_name
self.parent_class = parent_class
def __call__(self, *args, **kwargs):
func = getattr(self.parent_class, self.func_name)
return func(*args, **kwargs)
Ich frage mich jedoch, ob es eine bessere - standardmäßige - Möglichkeit gibt, ein solches Objekt zu beizen. Ich möchte keine Änderungen an der globalen vornehmenpickle
verarbeiten (mitcopy_reg
zum Beispiel), aber das folgende Muster wäre großartig: class MyClass (object): @picklable_staticmethod def foo (): print "done".
Meine Versuche diesbezüglich waren erfolglos, insbesondere weil ich die Eigentümerklasse nicht aus der extrahieren konntefoo
Funktion. Ich war sogar bereit, mich mit einer expliziten Spezifikation (wie@picklable_staticmethod(MyClass)
), aber ich kenne keine Möglichkeit, auf die zu verweisenMyClass
Klasse genau dort, wo sie definiert wird.
Irgendwelche Ideen wären toll!
Yonatan