我拉行作爲字典(使用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