我正在从 MySQL 数据库中提取行作为字典(使用 SSDictCursor)并使用以下方法进行一些处理:
from collections import namedtuple
class Foo(namedtuple('Foo', ['id', 'name', 'age'])):
__slots__ = ()
def __init__(self, *args):
super(Foo, self).__init__(self, *args)
# ...some class methods below here
class Bar(namedtuple('Bar', ['id', 'address', 'city', 'state']):
__slots__ = ()
def __init__(self, *args):
super(Bar, self).__init__(self, *args)
# some class methods here...
# more classes for distinct processing tasks...
要使用namedtuple
,我必须事先确切知道我想要的字段,这很好。但是,我希望允许用户将一个简单的SELECT *
语句输入到我的程序中,然后它将遍历结果集的行,使用这些不同的类执行多个任务。为了完成这项工作,我的类必须以某种方式检查从游标传入的 N 个字段,并且只获取与namedtuple
定义所期望的名称相对应的特定子集 M < N。
我的第一个想法是尝试编写一个可以应用于每个类的装饰器,它会检查该类以查看它所期望的字段,并仅将适当的参数传递给新对象。但是在过去的几天里,我刚刚开始阅读有关装饰器的内容,而且我对它们还没有那么自信。
所以我的问题分为两部分:
- 这可能与单个装饰器有关,它将确定被装饰的特定类需要哪些字段?
- 是否存在具有相同功能且更易于使用、修改和理解的替代方案?
我有太多潜在的表和字段排列,每个结果集中有数百万行,只需要编写一个通用namedtuple
子类来处理每个不同的任务。查询时间和可用内存已被证明是限制因素。
如果需要的话:
>>> sys.version
'2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]'