0

PyTables のドキュメントに基づくと、ネストされた型を定義する唯一の方法は、ネストされた型のインスタンスでクラス レベル/静的フィールドを作成するか、親クラスでネストされたクラスを定義することです。

問題は、非常に一般的なツリー表現が、子 Node インスタンスを持つ Node タイプを単純に使用していることです。通常、これは 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 with Node children 定義に適合するデータがあり、現時点では PyTables で表現できません。私が見逃しているトリックはありますか?

4

1 に答える 1

0

テーブルは、再帰構造を配置する適切な場所ではありません。グループ ツリーを使用して、必要なものを取得できるかどうか試してください。これはディレクトリやサブディレクトリと同様に機能するため、問題が解決する場合があります。サブグループとテーブルはいつでも 1 つのグループに入れることができます。さらに、属性をグループに使用できます。これにより、短い文字列などを格納できます。

これは PyTable とは関係ありません。純粋な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()

ここでは問題ありません。違いは、最初のケースにはクラス変数があり、2 番目のケースにはインスタンス変数があることです。whilea = A()は Python がソース コードに準拠したときに実行され、 のインスタンスを作成するとき、つまりself.a = A()実行時にのみ実行されます。A

于 2013-05-30T08:53:10.120 に答える