Domanda

Ho un progetto di miccia python basato sull'esempio Xmp nella documentazione di miccia. Ho incluso una piccola parte del codice per mostrare come funziona. Per qualche motivo get_file viene chiamato e la classe viene creata, ma invece di fondere la chiamata .read () sulla classe da get_file (file_class) fuse continua a chiamare Dstorage.read () che vanifica lo scopo di spostare la funzione di lettura da quella classe.

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)

Ho il mio codice ospitato su launchpad, puoi scaricarlo con questo comando.
bzr co https://code.launchpad.net/~asa- ayers / + junk / dstorage
bzr branch lp: ~ asa-ayers / dstorage / trunk

soluzione:
Ho usato una classe proxy che subclasse quella di cui avevo bisogno e nel costruttore ottengo l'istanza della classe di cui ho bisogno e sovrascrivo tutti i metodi del proxy per chiamare semplicemente i metodi dell'istanza.

È stato utile?

Soluzione

Guardando il codice della classe Fuse (che è un labirinto di piccoli passaggi tortuosi che creano proxy di metodo), vedo questo bit (che è una chiusura usata per creare un setter all'interno di Fuse.MethodProxy._add_class_type , riga 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)

Quando si esegue self.file_class = self.get_file , questo viene chiamato con self.get_file , che è un metodo associato. Il loop over degli attributi proxy si aspetta di essere in grado di ottenere gli attributi dalla classe impostata, inserendoli nel suo dizionario proxy mdic dopo averli inseriti, ma non sono lì, perché è un limite metodo, piuttosto che una classe. Dal momento che non li trova, torna a chiamarli su Dstorage .

Quindi, per farla breve, non è possibile utilizzare un callable che restituisce un'istanza (tipo di pseudo-classe) anziché una classe qui, poiché Fuse sta introspettendo l'oggetto che si imposta per trovare i metodi che dovrebbe chiamare .

Devi assegnare una classe a file_class - se devi fare riferimento all'istanza principale, puoi usare il trucco di classe nidificato che mostrano nei documenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top