2011-01-29 52 views
3

我有一個庫函數,它使用**kw,但我想傳遞一個類似字典的類,以便我可以覆蓋__getitem__來跟蹤對字典中對數據的訪問。例如,在下面的代碼中調用libfn不會打印訪問但libfn2會。自定義字典通過** kw

class Dtracker(dict): 
    def __init__(self): 
    dict.__init__(self) 
    def __getitem__(self,item): 
    print "Accessed %s" % str(item) 
    return dict.__getitem__(self, item) 


def libfn(**kw): 
    a = kw["foo"] 
    print "a is %s" % a 
    return a 

def libfn2(kw): 
    a = kw["foo"] 
    print "a is %s" % a 
    return a 

d = Dtracker() 
d["foo"] = "bar" 
libfn(**d) 
libfn2(d) 

回答

2

做這個

class Dtracker(dict): 
    def __init__(self,*arg,**kw): 
     super(Dtracker,self).__init__(*arg,**kw) 
    def __getitem__(self,item): 
     print "Accessed %s" % str(item) 
     return dict.__getitem__(self, item) 

def track(fn): 
    def tracked_fn(**kw): 
     kw= Dtracker(kw) 
     fn(kw) 
    return tracked_fn 

@track 
def libfn(kw): 
    a = kw["foo"] 
    print "a is %s" % a 
    return a 

這更多或更少的作品

>>> libfn(**{'foo':'bar'}) 
Accessed foo 
a is bar 
+0

謝謝!雖然第一個回答「你不能」似乎在技術上是正確的,但是這個回答讓我想要以最少的變化去做 - 最重要的是沒有API變化。我只需要破解圖書館*嘆息*。 – AndrewStone

+0

「破解圖書館」? –

5

如果不更改Python本身,則不能。它在較低的級別轉換爲dict

+1

...或圖書館接受字典對象。 –