如何通过变量定义pytables表列的形状?

时间:2013-12-06 14:20:57

标签: python metaclass pytables

我正在尝试创建一个IsDescription子类,以便我可以定义我正在尝试创建的表的结构。子类**的一个属性需要在给定一定长度之前进行整形,这个长度在运行时是未知的(它取决于正在解析的文件),但在运行时是固定的。

示例代码:

import tables
class MyClass(tables.IsDescription):
    def __init__(self, param):
        var1 = tables.Float64Col(shape=(param))

MyClass1 = MyClass(12)

返回:TypeError: object.__new__() takes no parameters。使用self.var1 = ...会产生同样的错误。

this SO question中,问题被列为因为IsDescription是元类,但没有理由说明为什么元类会禁止此行为,并且没有给出解决方法。

是否有一种解决方法允许PyTables中的表具有未知(但固定)的大小?

最后,为了避免XY problem条评论,我想我可能会使用数组或可扩展数组来做我正在尝试做的事情(这是输出解决方案数据到磁盘)。我仍然很想知道上述问题的答案。

**他们在PyTables文档中被称为属性,但写>>> subclass.attrib会返回AttributeError: type object 'subclass' has no attribute 'attrib',所以我不知道这是否是正确的单词

1 个答案:

答案 0 :(得分:1)

使用字典来定义表而不是子类化IsDescription

import tables
import numpy as np
param = 10
with tables.open_file('save.hdf','w') as saveFile:
    tabledef = {'var1':tables.Float64Col(shape=(param))}
    table = saveFile.create_table(saveFile.root,'test',tabledef)
    tablerow = table.row
    tablerow['var1'] = np.array([1,2,3,4,5,6,7,8,9,0])
    tablerow.append()
    table.flush()
with tables.open_file('save.hdf','r') as sv:
    sv.root.test.read()