我正在使用SSDictCursor从MySQL数据库中提取行作为字典,并进行一些处理,采用以下方法:
要使用
我的第一个想法是尝试编写一个可以应用于每个类的单个装饰器,该装饰器将检查类以查看它需要哪些字段,并仅将适当的参数传递给新对象。但是,我最近几天才开始阅读有关装饰器的内容,对它们还不太自信。
因此,我的问题分为两部分:
1.是否可能使用单个装饰器完成此操作,以找出由特定类进行装饰所需的字段?
2.是否有一种具有相同功能的替代方法,可以更易于使用、修改和理解?
我有太多的表格和字段组合,每个结果集中都有数百万行,无法编写一个通用的
如果需要:
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。我的第一个想法是尝试编写一个可以应用于每个类的单个装饰器,该装饰器将检查类以查看它需要哪些字段,并仅将适当的参数传递给新对象。但是,我最近几天才开始阅读有关装饰器的内容,对它们还不太自信。
因此,我的问题分为两部分:
1.是否可能使用单个装饰器完成此操作,以找出由特定类进行装饰所需的字段?
2.是否有一种具有相同功能的替代方法,可以更易于使用、修改和理解?
我有太多的表格和字段组合,每个结果集中都有数百万行,无法编写一个通用的
namedtuple
子类来处理每个不同的任务。查询时间和可用内存已经成为限制因素。如果需要:
>>> sys.version
'2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]'
Foo
和另一个带有另一组字段的Bar
。 - undefinedLenientNamedTuple.__new__
内,可以处理len(args) > len(fields)
(例如通过截断)并保留len(args) < len(fields)
不变。不过,我认为根据我的需求,完全禁止非关键字参数更好。按照编程哲学的原则:显式、简单。 - undefineddef foo(*args, **kwargs): print(args, kwargs)
;这比阅读文档来弄清规则的细枝末节要容易得多。(就我个人而言,我经常忘记2.x和3.x之间的差异之一,并启动一个解释器找出答案。)但无论如何,关于参数过多的想法很好-尽管你可以用更简单的方法来做;让我编辑一下答案。除非您想提供一些默认值,否则不能允许参数过少。 - undefined