2012-03-07 1 views
3

Я ищу совет по Элегантный дизайн для представления каталога файлов без символических ссылок в Python, где я могу запросить отношения в терминах «принадлежит» (например, G является подкаталог/A/B/C). Мое нынешнее мышление идет в этом направлении:Ищем элегантный дизайн представления данных для дерева каталогов

Путь к корню I os.path.walk() сверху вниз. Два класса представляют типы узлов, которые меня интересуют, и я отслеживаю родительские дочерние отношения.

class ADir(object): 
    def __init_(self, name, parent=None): 
     self.name = name 
     self.parent = parent 
     self.children = [] 
    def add_child(self, id): 
     self.children.append(id) 

class AFile(object): 
    def __init_(self, name, parent=None): 
     self.name = name 
     self.parent = parent 

я бы повторно осуществить проверку для существующих каталогов, функций, которые дают мне позицию каталог/файл и т.д. Это все начинает чувствовать себя очень похож на переопределённом существующие, общие алгоритмы дерева.

Траулинг-лоток StackExchange, Google и т. Д. Дает множество различных подходов. Ничто из того, что я нашел, похоже, не использует естественные границы, заданные структурой каталогов.

Любые мысли и указатели на обсуждения, записи в блогах и код оцениваются.

+0

Что вам кажется разумным. Я не уверен, в чем вопрос. Возможно, если вы объясните, что вы пытаетесь выполнить ... –

+0

Суть моего вопроса в том, что я пытаюсь изобрести колесо при сопоставлении структуры каталога файлов с моделью данных в Python. Исходная спецификация предложила перевести структуру каталогов в XML и обработать запросы с помощью _lxml.etree_. Кажется, излишний и неуклюжий для меня, тем более, что я не могу прикрепить «полезную нагрузку» (операции над набором файлов) элегантно. Может быть, это объясняет немного лучше, что на фоне моего довольно широкого вопроса. – Axial

ответ

2

Проблема с древовидными структурами на современных языках состоит в том, что трудно создать одну структуру, соответствующую всем этим. Существует много способов создания тройки (с родительским указателем или без него, детьми могут быть пары (двоичные или красно-черные деревья) или списки (с индексированием ключей поиска и без них).

Хотя можно определить обход алгоритмы для всех из них, но каждый алгоритм нуждается в отдельной реализации.

Тогда у нас есть проблема поиска элементов в дереве. Работаем ли мы по индексу (довольно бесполезно в бинарных деревьях)? Какой-то идентификатор? идентификаторы имеют? Как мы создаем пути из этих идентификаторов? Как мы представляем относительные пути?

Вот почему у нас есть карты и списки, встроенные во многие современные языки, но без деревьев. знание, Scala является одним из немногих языков OO, которые поддерживают концепцию типа древовидного дерева, но только бинарные деревья и даже те, которые несколько нечетны.

Кроме того, большинство языков OO не поддерживают достаточно способов создания классов из фрагментов существующих классов. Вы можете наследовать (но тогда вы получаете все), множественное наследование (еще больше проблем), mix in (некоторые функции множественного наследования без каких-либо недостатков). Но у меня действительно отсутствует функция, которая гласит: принять метод x() от типа Foo и метод y() от Bar для сборки Baz.

Без этого базовый класс дерева основанный на OO нуждается в большой настройке для вашего конкретного случая использования, в то время как для непосредственного внедрения той же функции потребуется такая же сумма (или даже меньше) строк кода.

+0

Спасибо Аарону, это очень полезно и проверяет мое подозрение, что необходима индивидуальная реализация.Интересен также указатель на Scala и его общий тип дерева. – Axial

Смежные вопросы