2013-05-21 2 views
0

Основываясь на документации 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 

У меня есть данные, что соответствует тип узла с узлом определения детей, и я не могу представить его с PyTables в данный момент. Есть ли трюк, который мне не хватает?

ответ

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

Проблема здесь. Разница в том, что в случае frist мы имеем переменную класса, а во второй - переменную экземпляра. В то время как a = A() будет , выполненный, когда Python соответствует исходному коду, self.a = A() будет выполняться только при создании экземпляра A, то есть во время выполнения.

+0

Мне это известно. Я написал «Так как определение класса в Python не может быть использовано в инициализации поля уровня класса ...» в моем вопросе. pyTables использует переменные класса. Поэтому я должен использовать переменные класса, следовательно: проблема, которую я объяснил в своем вопросе. – mahonya

+0

Вид сверх этого. Добавлены некоторые подсказки, которые могут помочь в ответе. –