基于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表示。有没有我缺少的技巧?
答案 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
的实例时执行,即在运行时执行。