在Python中,dict对象有一个“pop”方法,它返回并从dict中删除一个键,如果该键不存在,则使用可选的默认值。
对一般对象属性执行此操作的最佳方法是什么?
我在想:
my_obj.__dict__.pop('key_name', default)
应该是一个不错的选择,但我担心直接静音对象的 dict 可能会产生我不知道的意外副作用。有更好的选择吗?
答案 0 :(得分:2)
(对于__dict__
的对象)“弹出”属性与从__dict__
弹出属性相同,因此建议的实现是正确的。
编辑:@Erik正确地指出使用__dict__.pop
可以引发KeyError
,其中适用的例外是AttributeError
。因此,更好的实现会添加try / catch / reraise-as-AttributeError。
我只想指出,您要做的是“弹出”对象的属性,而不是键。
答案 1 :(得分:2)
编辑:可能更快且线程安全的替代方案,并KeyError
到AttributeError
的正确映射:
_NO_DEFAULT = object() # so that None could be used as a default value also
def popattr(obj, name, default=_NO_DEFAULT):
try:
return obj.__dict__.pop(name)
except KeyError:
if default is not _NO_DEFAULT:
return default
raise AttributeError("no attribute '%s'" % name)
# or getattr(obj, name) to generate a real AttributeError
(上一个回答)
这样的事情应该有效:
def popattr(obj, name):
ret = getattr(obj, name)
delattr(obj, name)
return ret
虽然obj.__dict__.pop(name)
也可以,但是如果属性不存在而你将获得KeyError
而不是AttributeError
,我会说后者在语义上对于对象是正确的属性访问; KeyError
用于词典,但您并非真正访问词典;您使用__dict__
的事实只是属性弹出的实现细节,应该隐藏,这是popattr
所做的。