Pregunta

Tengo un proyecto de fusible de Python basado en el ejemplo de Xmp en la documentación del fusible. He incluido una pequeña parte del código para mostrar cómo funciona esto. Por alguna razón, se llama a get_file y se crea la clase, pero en lugar de que el fusible llame a .read () en la clase desde get_file (file_class), el fusible sigue llamando a Dstorage.read (), lo que anula el propósito de mover la función de lectura fuera de ese clase.

class Dstorage(Fuse, Distributor):
    def get_file(self, server, path, flags, *mode):
        pass
        # This does some work and passes back an instance of
        # a class very similar to XmpFile

    def main(self, *a, **kw):
        self.file_class = self.get_file
        return Fuse.main(self, *a, **kw)

Tengo mi código alojado en el launchpad, puedes descargarlo con este comando.
bzr co https://code.launchpad.net/~asa- ayers / + junk / dstorage
bzr branch lp: ~ asa-ayers / dstorage / trunk

solución:
Utilicé una clase proxy que subclasifica la que necesitaba y en el constructor obtengo la instancia de la clase que necesito y sobrescribo todos los métodos del proxy para simplemente llamar a los métodos de instancia.

¿Fue útil?

Solución

Al mirar el código de la clase Fuse (que es un laberinto de pequeños pasajes retorcidos que crean proxies de método), veo este bit (que es un cierre utilizado para crear un setter dentro de Fuse.MethodProxy._add_class_type , línea 865):

        def setter(self, xcls):

            setattr(self, type + '_class', xcls)

            for m in inits:
                self.mdic[m] = xcls

            for m in proxied:
                if hasattr(xcls, m):
                    self.mdic[m] = self.proxyclass(m)

Cuando haces self.file_class = self.get_file , esto se llama con self.get_file , que es un método enlazado. El ciclo sobre los atributos proxy espera poder sacar los atributos de la clase que establezca, para ponerlos en su diccionario proxy mdic después de envolverlos, pero no están allí, porque es un límite método, en lugar de una clase. Como no puede encontrarlos, vuelve a llamarlos en Dstorage .

Entonces, para resumir, no puede usar un invocable que devuelva una instancia (una especie de pseudo-clase) en lugar de una clase aquí, porque Fuse está introspectando el objeto que configuró para encontrar los métodos que debería llamar .

Debe asignar una clase a file_class ; si necesita volver a la instancia principal, puede usar el truco de clase anidada que muestran en los documentos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top