我们知道如果我们需要使用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()或后代构造函数来正确初始化列。
答案 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
)以这种方式使用元类。