Python 関数デコレーター
まず、あなたが話している概念は関数デコレータの概念です。関数デコレーターは、関数定義が始まる前の行 (シンボル@
) に配置することで、関数定義に適用されます。関数の動作を変更したり、関数の合成を操作したりするためのツールです。ここに例があります
class entryExit(object):
def __init__(self, f):
self.f = f
def __call__(self):
print "Entering", self.f.__name__
self.f()
print "Exited", self.f.__name__
@entryExit # decorator
def func1(): # decorated function
print "inside func1()"
@entryExit
def func2():
print "inside func2()"
私は走る
func1()
func2()
私は得る
Entering func1
inside func1()
Exited func1
Entering func2
inside func2()
Exited func2
Python unittest.mock.patch()
patch は、関数デコレーター、クラス デコレーター、またはコンテキスト マネージャーとして機能します。関数の本体または with ステートメント内で、ターゲットに新しいオブジェクトがパッチされます。function/with ステートメントが終了すると、パッチは取り消されます。
Patch を使用すると、with
ステートメント内の関数の動作を変更できます。
with
これは、 patch() がステートメントでコンテキストマネージャーとして使用される例です。
>>> with patch.object(ProductionClass, 'method', return_value=None)
as mock_method:
... thing = ProductionClass()
... thing.method(1, 2, 3)
...
>>> mock_method.assert_called_once_with(1, 2, 3)