Pythonのデコレータがコードに何をするのかを見ることができますか?
-
20-12-2019 - |
質問
Pythonデコレータのアプリケーションが私が適用した関数で何をしたかを見る方法はあります。たとえば、
がある場合class A(object):
@property
def something(self):
return 0
.
something
に実行されているコードが実際にどのように見えますか。これを行う方法はありますか?
解決
デコレータはコードを生成しません。デコレータは本当に構文砂糖のみです:
@property
def something(self):
return 42
.
は実際に解釈されています。
def something(self):
return 42
something = property(something)
.
e.g。 @
記号に続く式が評価され、結果は呼び出され、@
行の後に関数またはクラスを渡します。デコレータがを返すものがのオブジェクトのオブジェクトを返します。
イントロスペクション目的で、@
ラインはが保持されていません。あなたは存在する装飾者を発見するためにソースコード自体を解析する必要があります。デコレータは新しいオブジェクトを返す義務を負いません。元のオブジェクトを変更できなくなり、イントロスペクションでは違いを知ることはできません。
あなたの最善の策はデコレータのソースに戻ることです、そしてそのコードを読むだけです。 property
デコレータはCで実装されていますが、記述子HOWTO Pythonが含まれています同じことをする実装:
class Property(object):
"Emulate PyProperty_Type() in Objects/descrobject.c"
def __init__(self, fget=None, fset=None, fdel=None, doc=None):
self.fget = fget
self.fset = fset
self.fdel = fdel
if doc is None and fget is not None:
doc = fget.__doc__
self.__doc__ = doc
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.fget is None:
raise AttributeError("unreadable attribute")
return self.fget(obj)
def __set__(self, obj, value):
if self.fset is None:
raise AttributeError("can't set attribute")
self.fset(obj, value)
def __delete__(self, obj):
if self.fdel is None:
raise AttributeError("can't delete attribute")
self.fdel(obj)
def getter(self, fget):
return type(self)(fget, self.fset, self.fdel, self.__doc__)
def setter(self, fset):
return type(self)(self.fget, fset, self.fdel, self.__doc__)
def deleter(self, fdel):
return type(self)(self.fget, self.fset, fdel, self.__doc__)
. 所属していません StackOverflow