7

Python では、dict オブジェクトには "pop" メソッドがあり、dict からキーを返したり削除したりします。キーが存在しない場合は、オプションのデフォルトが使用されます。

一般的なオブジェクト属性に対してこれを行う最良の方法は何ですか?

考えている:

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

良いオプションであるはずですが、オブジェクトの辞書を直接ミュートすると、私が気付いていない意図しない副作用が発生する可能性があるのではないかと心配しています。より良いオプションはありますか?

4

2 に答える 2

3

編集:KeyError toの適切なマッピングを使用した、おそらくより高速でスレッドセーフな代替手段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ます。

于 2013-10-23T19:46:19.483 に答える