編集: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
ます。