如何在python中实现属性pop

时间:2013-10-23 19:39:37

标签: python

在Python中,dict对象有一个“pop”方法,它返回并从dict中删除一个键,如果该键不存在,则使用可选的默认值。

对一般对象属性执行此操作的最佳方法是什么?

我在想:

my_obj.__dict__.pop('key_name', default)

应该是一个不错的选择,但我担心直接静音对象的 dict 可能会产生我不知道的意外副作用。有更好的选择吗?

2 个答案:

答案 0 :(得分:2)

(对于__dict__的对象)“弹出”属性与从__dict__弹出属性相同,因此建议的实现是正确的。

编辑:@Erik正确地指出使用__dict__.pop可以引发KeyError,其中适用的例外是AttributeError。因此,更好的实现会添加try / catch / reraise-as-AttributeError。

我只想指出,您要做的是“弹出”对象的属性,而不是

答案 1 :(得分:2)

编辑:可能更快且线程安全的替代方案,并KeyErrorAttributeError的正确映射:

_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所做的。