如何在PyTables中为父级和子级使用相同的类型定义嵌套节点结构?

时间:2013-05-21 16:27:59

标签: python hdf5 pytables

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

问题是,一个非常常见的树表示只是使用具有子节点实例的节点类型。通常,这不是Python类的问题,因为动态类型不会强制我定义子类型(ren),并且在运行时,节点实例可以作为子节点添加到另一个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,目前我无法用PyTables表示。有没有我缺少的技巧?

1 个答案:

答案 0 :(得分:0)

表不是放置递归结构的正确位置。尝试使用组树可以获得所需的内容。由于这类似于目录和子目录,它可以解决您的问题。您始终可以将子组和表放入一个组中。此外,您可以将属性用于组。这允许您存储较短的字符串等。

这与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的实例时执行,即在运行时执行。