Pourquoi le fusible n'utilise-t-il pas la classe fournie dans file_class?

StackOverflow https://stackoverflow.com/questions/300047

  •  08-07-2019
  •  | 
  •  

Question

J'ai un projet de fusible python basé sur l'exemple Xmp dans la documentation de fusible. J'ai inclus un petit morceau du code pour montrer comment cela fonctionne. Pour une raison quelconque, get_file est appelé et la classe est créée, mais au lieu de fusionner l'appel de .read () sur la classe à partir de get_file (file_class), Fuse continue d'appeler Dstorage.read (), ce qui annule la fonction de déplacement de la fonction de lecture. 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)

Mon code est hébergé sur le tableau de bord. Vous pouvez le télécharger avec cette commande.
bzr co https://code.launchpad.net/~asa- ayers / + junk / dstorage
branche bzr lp: ~ asa-ayers / dstorage / trunk

solution:
J'ai utilisé une classe proxy qui sous-classe celle dont j'avais besoin et dans le constructeur, j'ai l'instance de la classe dont j'ai besoin et j'écrase toutes les méthodes du proxy pour simplement appeler les méthodes d'instance.

Était-ce utile?

La solution

En regardant le code de la classe Fuse (qui est un labyrinthe de petits passages sinueux créant des procurations de méthode), je vois ce bit (qui est une fermeture utilisée pour créer un séparateur à l'intérieur de Fuse.MethodProxy._add_class_type , ligne 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)

Quand vous faites self.file_class = self.get_file , cela s'appelle avec self.get_file , qui est une méthode liée. La boucle sur les attributs mandatés s'attend à pouvoir extraire les attributs de la classe que vous avez définie, à les placer dans son dictionnaire proxy mdic après les avoir enveloppés, mais ils ne sont pas là, car c'est une limite méthode, plutôt que d'une classe. Comme il ne peut pas les trouver, il revient à les appeler le Dstorage .

Donc, en résumé, vous ne pouvez pas utiliser un appelable qui renvoie une instance (une sorte de pseudo-classe) au lieu d'une classe ici, car Fuse introspectionne l'objet que vous avez défini pour trouver les méthodes qu'il doit appeler. .

Vous devez affecter une classe à classe_fichier . Si vous devez vous référer à l'occurrence parent, vous pouvez utiliser l'astuce de classe imbriquée affichée dans les documents.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top