概要
メソッドが直接呼び出されたのではなく、プロパティを介して呼び出されたかどうかを判断することは可能ですか?
詳細
一部のコードに API の変更を加えています。古い API では Getter と Setter (GetAttr
とSetAttr
) が使用されていましたが、新しいパブリック API ではx.Attr
とがx.Attr = val
それぞれ使用されます。プログラマーが呼び出したときに非推奨の警告を追加したいGetAttr()
事実上、私が探しているのはこの魔法の_was called_via_property
関数です:
import warnings
class MyClass(object):
def __init__(self):
self._attr = None
def GetAttr(self):
if not _was_called_via_property():
warnings.warn("`GetAttr()` is deprecated. Use `x.attr` property instead.", DeprecationWarning)
return self._attr
def SetAttr(self, value):
if not _was_called_via_property():
warnings.warn("deprecated", DeprecationWarning)
self._attr = value
Attr = property(GetAttr, SetAttr)
関数に加えてデコレータを介して物事が定義されている場合、理想的にはソリューションも機能しproperty()
ますが、必須ではありません。
そのようです:
@property
def attr(self):
if not _was_called_via_property():
warnings.warn("deprecated", DeprecationWarning)
return self._attr
@attr.setter
def attr(self, value):
if not _was_called_via_property():
warnings.warn("deprecated", DeprecationWarning)
self._attr = value