Perché il fusibile non utilizza la classe fornita in file_class
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.
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.