星期五, 十月 12, 2007

python *args and wrapped BDB's pop() default

>>> def f(x, **kwargs):
... print kwargs
...
>>> f(1)
{}
我在 cutils 项目的 mirrord/fs_mirror 中好几个地方都使用了 Berkeley DB,并且是包裹在一个模拟字典类的对象中的(hash table like),为使其 pop() 操作更接近于内置的 dict 对象,特别是在返回默认值的操作上能够保持一致的行为方式,编码如下:
def pop(self, key, *args):
if args:
try:
args_len = len(args)
if args_len > 1:
raise TypeError, "pop() takes exactly 2 arguments (%d given)" % args_len
default = args[0]
except KeyError:
pass
try:
self.dbfile.pop(key)
except KeyError, kexc:
try:
return default
except NameError:
raise KeyError, kexc

没有评论: