Pergunta

Eu tenho um projeto python fusível com base no exemplo Xmp na documentação do fusível. Eu incluí um pequeno pedaço de código para mostrar como isso funciona. Por alguma razão get_file não se ligou e a classe é criada, mas ao invés de fusíveis chamando .read () na classe de get_file (file_class) fusível continua chamando Dstorage.read (), que derrota o propósito de mover a função de leitura fora dessa 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)

Eu tenho o meu código hospedado no Launchpad, você pode baixá-lo com este comando.
bzr co https://code.launchpad.net/~asa- Ayers / + junk / dstorage
bzr branch lp: ~ asa-Ayers / dstorage / trunk

Solução:
Eu usei uma classe proxy que subclasses o que eu precisava e no construtor recebo a instância da classe que eu preciso e substituir todos os métodos do proxy para simplesmente chamar os métodos de instância.

Foi útil?

Solução

Olhando para o código da classe Fuse (que é um labirinto de pequenas passagens sinuosas criando proxies método), eu vejo isso pouco (que é um fechamento usado para criar um setter dentro Fuse.MethodProxy._add_class_type, linha 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 você faz self.file_class = self.get_file, este é chamado com self.get_file, que é um método vinculado. O laço sobre atributos em proxy está esperando para ser capaz de obter os atributos off da classe que você definir, para colocá-los em seu dicionário procuração mdic depois de envolvê-los, mas eles não estão lá, porque é um método vinculado, em vez de uma classe. Uma vez que não pode encontrá-los, ele reverte para chamá-los em Dstorage.

Então, longa história curta, você não pode usar uma exigível que retorna uma instância (uma espécie de pseudo-class) em vez de uma classe aqui, porque Fuse é introspecção do objeto que você definir para encontrar os métodos que deve chamar .

Você precisa atribuir uma classe para file_class - se você precisa de remeter para a instância pai, você pode usar o truque classe aninhada eles mostram nos docs

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top