我拉行作为字典(使用SSDictCursor)一的参数集,并做一些处理,使用下面的方法一个namedtuple对象:创建仅利用MySQL数据库通过
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)]'
谢谢,我很欣赏细节。然而,当我们在'Wrapper'类中硬编码时,我没有看到如何用一组字段和'Bar'来声明'Foo'和另一组字段? – Air
经过一番尝试,似乎可以与'class Wrapper(namedtuple(name,fields))'一起工作。不能可靠地采取args-only或混合args/kwargs,但这对我来说不是问题。如果该行只是一个混乱,请编辑,我会接受。 – Air
@AirThomas:哪里不能采用独立或混合参数?我只是在每一个我拥有的Python上进行了测试,在每个我能想到的参数组合中都能够测试,并且它总能按预期工作。请参阅编辑答案中的链接。 – abarnert