如何使用' for循环来定义列名称'在一个类(IsDescription)中

时间:2015-02-01 02:44:22

标签: python pytables

我们知道如果我们需要使用pytables定义表的列名,我们可以通过以下方式完成:

class Project(IsDescription):
    alpha = StringCol(20)
    beta  = StringCol(20) 
    gamma = StringCol(20)

其中alpha,beta和gamma是表的所需列名。 但是假设我想使用包含列名的列表“ColumnNames_list”,如下所示: ColumnNames_list [0] = alpha,ColumnNames_list [1] = beta,ColumnNames_list [2] = gamma

那么我应该如何定义上面的“Project”类?

我尝试了以下内容:

ColumnNames_list = []
ColumnNames_list[0] = alpha 
ColumnNames_list[1] = beta 
ColumnNames_list[2] = gamma

class Project(IsDescription):
    for i in range (0, 10):
        ColumnNames_list[i] = StringCol(20)  

显示错误:

TypeError:将不正确的值传递给表列。期望一个Col(或子类)实例并得到:“2”。请使用Col()或后代构造函数来正确初始化列。

1 个答案:

答案 0 :(得分:1)

有几个选择。第一个(最简单的)是在创建类之后添加属性:

class Project(IsDescription):
    pass

for name in ColumnNames_List:
    setattr(Project, name, StringCol(20))

这个有很多不同的内容(例如你可以通过类装饰器来完成)。

下一个选项是使用内置type构建类:

names = {name: StringCol(20) for name in ColumnNames_List}
Project = type('Project', (IsDescription,), names)

这种方法的优点是即使IsDescription上的某个时髦元类要求在类构造时间 1 设置属性,它仍然有效。当我们谈论元类时......你可以使用元类来做到这一点,但这几乎肯定是矫枉过正。

1 这是一种罕见的情况,但是一些流行的第三方库(例如sqlalchemy)以这种方式使用元类。