我有一个使用**kw
的库函数,但我想传递一个类似字典的类,以便我可以覆盖__getitem__
来跟踪它对字典中数据的访问。例如,在下面的代码中,调用libfn不会打印Accessed但libfn2会打印。
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)
答案 0 :(得分:5)
如果不改变Python本身,你就不能。它在较低级别转换为dict
。
答案 1 :(得分: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