寻求一种优雅的数据表示设计,用于目录树。

3
我正在寻求有关Python中表示文件目录的优雅设计建议,而不使用符号链接,可以查询“属于”关系(例如,G是/A/B/C的子目录)。 我目前的想法是:

给定根路径,我通过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等网站上搜索可以找到许多不同的方法。但我没有发现任何一种方法利用目录结构的自然边界。

欢迎提出任何想法和指向讨论、博客文章和代码的链接。


你所提供的看起来很合理。我不确定问题在哪里。也许如果你解释一下你想要实现什么... - Jim Garrison
我的问题要点是,在Python中将文件目录结构映射到数据模型时,我是否试图重复造轮子。最初的规范建议将目录结构转换为XML,并使用类似_lxml.etree_的工具处理查询。对我来说,这似乎过于繁琐和笨重,特别是因为我无法优雅地附加“有效负载”(一组文件上的操作)。也许这能更好地解释我相当广泛的问题背景。 - Axial
1个回答

2
今天的语言中树形结构的问题在于很难创建一个适用于所有情况的结构。有许多构建树的方式(有或没有父指针,子节点可以是成对的(二叉或红黑树)或列表(带或不带查找键索引))。
虽然可能为它们定义遍历算法,但每个算法都需要不同的实现。
然后我们面临在树中查找元素的问题。我们按索引工作(在二叉树中没什么用)吗?使用某些标识符?标识符应该是什么类型?如何从这些标识符构建路径?如何表示相对路径?
这就是为什么许多现代语言内置了映射和列表,但没有树。据我所知,Scala是支持通用树类型概念的少数面向对象语言之一,但只支持二叉树,而且即使是那些也有些奇怪。
此外,大多数面向对象的编程语言都不支持足够多的方法来从现有类的片段构建类。你可以继承(但那样你就得到了一切),多重继承(更多问题),混入(获得多重继承的某些特性而不带来某些缺点)。但我真的很想要一个功能,它说:“从类型Foo中获取方法x(),从Bar中获取方法y()来构建Baz”。
没有这个功能,基于OO的树形基类将需要在您特定的用例中进行大量调整,而直接实现相同的功能将需要相同数量(甚至更少)的代码行。

谢谢Aaron,这非常有帮助,也证实了我的猜测,需要定制化的实现。指向Scala及其通用树类型的指针也很有趣。 - Axial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接