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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage