【问题标题】:How can I define a nested node structure using the same type for parent and child in PyTables?如何在 PyTables 中使用相同类型的父子节点定义嵌套节点结构?
【发布时间】:2013-05-16 12:16:42
【问题描述】:

根据 PyTables 文档,定义嵌套类型的唯一方法似乎是使用嵌套类型实例创建类级别/静态字段,或者在父类中定义嵌套类。

问题是,一个非常常见的树表示只是使用带有子节点实例的节点类型。通常,这对于 Python 类来说不是问题,因为动态类型不会强制我定义子 (ren) 的类型,并且在运行时,可以将一个 Node 实例作为子级添加到另一个 Node 实例中。

另一方面,PyTables 要求定义字段的类型。由于 Python 中的类定义不能用于类级别的字段初始化,因此最常见的父子结构定义方式变得不可用。我不确定这是否是 HDF5 级别存在的约束(未检查)。这是一个问题的例子:

class A(IsDescription):
    valstring = StringCol(250, pos=1)
    child = A()# IMPOSSIBLE 

class A(IsDescription):
    valstring = StringCol(250, pos=1)
    #the following would work, but now I can't define
    #another AChild as child, so I got stuck with depth 1
    class AChild(IsDescription):
        valstring = StringCol(250, pos=1)
        class ANewChild(IsDescription):
            valstring = ....#useless

我的数据符合具有 Node 子级定义的 Node 类型,目前我无法用 PyTables 表示它。有没有我错过的技巧?

【问题讨论】:

    标签: python hdf5 pytables


    【解决方案1】:

    表格不是放置递归结构的正确位置。尝试使用组树是否可以得到想要的东西。由于这类似于目录和子目录,它可能会解决您的问题。您始终可以将子组和表放在一个组中。此外,您可以对组使用属性。这允许您存储较短的字符串等。

    这与 PyTables 无关。用纯 Python 试试这个

    >>> class A(object):
    ...     a = A()
    ... 
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 2, in A
    NameError: name 'A' is not defined
    

    您不能使用尚未定义的名称。很可能,您会这样想:

    >>> class A(object):
    ...     def __init__(self):
    ...         self.a = A()
    

    这里没问题。不同之处在于,在第一种情况下,我们有一个类变量,而在第二种情况下,我们有一个实例变量。而a = A() 将是 在 Python 编译源代码时执行,self.a = A() 只会在您创建 A 的实例时执行,即在运行时。

    【讨论】:

    • 我知道这一点。我在我的问题中写了“由于 Python 中的类定义不能用于类级字段初始化......”。 pyTables 使用类变量。所以我必须使用类变量,因此:我在我的问题中解释的问题。
    • 有点过头了。添加了一些可能有助于回答的提示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2020-01-30
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    相关资源
    最近更新 更多