0

根据 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 表示它。有没有我错过的技巧?

4

1 回答 1

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()

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

于 2013-05-30T08:53:10.120 回答