Почему fuse не использует класс, предоставленный в file_class - PullRequest
1 голос
/ 18 ноября 2008

У меня есть проект python fuse, основанный на примере Xmp в документации по fuse. Я включил небольшой фрагмент кода, чтобы показать, как это работает. По какой-то причине get_file действительно вызывается, и класс создается, но вместо fuse, вызывающего .read () для класса из get_file (file_class), fuse продолжает вызывать Dstorage.read (), что лишает цель удаления этой функции из этой функции. класс.

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)

Мой код размещен на панели запуска, вы можете скачать его с помощью этой команды.
bzr co https://code.launchpad.net/~asa-ayers/+junk/dstorage
БЗР филиал lp: ~ asa-ayers / dstorage / trunk

решение:
Я использовал прокси-класс, который подклассирует тот, который мне нужен, и в конструкторе я получаю экземпляр класса, который мне нужен, и перезаписываю все методы прокси, чтобы просто вызывать методы экземпляра.

1 Ответ

1 голос
/ 19 ноября 2008

Глядя на код класса Fuse (который представляет собой лабиринт извилистых маленьких отрывков, создающих прокси метода), я вижу этот бит (который является замыканием, используемым для создания сеттера внутри Fuse.MethodProxy._add_class_type, строка 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)

Когда вы делаете self.file_class = self.get_file, это вызывается с self.get_file, который является связанным методом. Ожидается, что зацикленные прокси-атрибуты смогут получить атрибуты из заданного вами класса, поместить их в свой прокси-словарь mdic после переноса, но их там нет, потому что это скорее связанный метод, чем учебный класс. Поскольку он не может их найти, он обращается к ним по номеру Dstorage.

Итак, короче говоря, вы не можете использовать вызываемый объект, который возвращает экземпляр (вид псевдокласса) вместо класса здесь, потому что Fuse анализирует объект, который вы установили, чтобы найти методы, которые он должен вызывать ,

Вам необходимо назначить класс для file_class - если вам нужно вернуться к родительскому экземпляру, вы можете использовать трюк с вложенным классом, который они показывают в документах.

...