需要建议如何在Python中表示某个数据结构

1 python

我不确定如何在Python中表示某个数据结构.它由组和用户组成,其中每个用户必须是一个组的成员,并且组应该又包含在容器中,组和用户将仅在此容器中使用.此外,我需要随机访问组和用户.示例数据的JSON表示如下所示:

{
    "groupa": {
        "name": "groupa",
        "description": "bla",
        "members": {
            "usera": {
                "name": "usera",
                "age": 38
            },
            "userb": {
                "name": "userb",
                "age": 20
            }
        }
    },
    "groupb": {
        "name": "groupb",
        "description": "bla bla",
        "members": {
            "userc": {
                "name": "userc",
                "age": 56
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

简单地使用嵌套的dict似乎不合适,因为用户和组都具有良好定义的属性.因为组和用户只在容器中使用,所以我想出了一个嵌套类:

class AccountContainer:
    class Group:
        def __init__(self, container, group):
            self.name = group
            self.members = {}
            self.container = container
            self.container.groups[self.name] = self # add myself to container


    class User:
        def __init__(self, group, user, age=None):
            self.name = user
            self.age = age
            self.group = group
            self.group.members[self.name] = self # add myself to group

    def __init__(self):
        self.groups = {}

    def add_user(self, group, username, age=None):
        # possibly check if group exists
        self.groups[group].members[username] = AccountContainer.User(self.groups[group], username, age=age)

    def add_group(self, group):
        self.groups[group] = AccountContainer.Group(self, group)


# creating
c = AccountContainer()
c.add_group("groupa")
c.add_user("groupa", "usera")

# access
c.groups["groupa"].members["usera"].age = 38

# deleting
del(c.groups["groupa"].members["usera"])
Run Code Online (Sandbox Code Playgroud)
  • 你会如何代表这样的数据结构?
  • 这是一种合理的方法吗?

对我来说,使用一种方法来创建一个组或用户,而不是指代dicts,这似乎有点不自然.

Ale*_*lli 5

我认为,在多范式语言(比如C++或Python,虽然支持类不会限制你在更简单的结构中使用它们时)的大量无行为类是一种"设计气味" - 设计相当于"代码气味",尽管是温和的.

如果我正在对此进行代码审查,我会指出这一点,尽管让我坚持重新考虑因素并不是那么糟糕.嵌套类(没有特定的代码 - 行为原因要嵌套)使它复合:它们没有提供特定的好处,另一方面可以"阻碍",例如,在Python中,通过干扰序列化(酸洗).

除了好的旧的dicts和成熟的类之外,Python 2.6还为带有预定义属性集的"structs"提供了一个方便的namedtuple s 替代方案.它们似乎特别适合这种用例.

方便的"将该组/用户添加到该容器/组中"功能可以重新组合到您的方法add...__init__独立功能中(访问者也可以,即使这不是一个问题 - 将内部结构隐藏到独立访问器中也会让您更接近遵守得墨忒耳法则.