連番ファイル Pythonで2つのデコレータを1つにまとめることはできますか?




python 連番ファイル 出力 (4)

Pythonで2つのデコレータを1つの新しいデコレータに結合する方法はありますか?

私は関数に複数のデコレータを適用することができますが、2つを新しいものに組み合わせる簡単な方法があるかどうか不思議でした。


はい。 デコレータの定義を参照してください。

このようなものはうまくいくはずです:

def multiple_decorators(func):
   return decorator1(decorator2(func))

@multiple_decorators
def foo(): pass

デコレータが追加の引数を取らない場合は、

def compose(f, g):
    return lambda x: f(g(x))

combined_decorator = compose(decorator1, decorator2)

@combined_decorator
def f():
    pass

同等になります

@decorator1
@decorator2
def f():
    pass

テストスイートであまりにも多くのことを繰り返したくない場合は、次のようにすることができます::

def apply_patches(func):
    @functools.wraps(func)
    @mock.patch('foo.settings.USE_FAKE_CONNECTION', False)
    @mock.patch('foo.settings.DATABASE_URI', 'li://foo')
    @mock.patch('foo.connection.api.Session.post', autospec=True)
    def _(*args, **kwargs):
        return func(*args, **kwargs)

    return _

今では、テストスイートで、各機能の上にデコレータの狂気の量を使用する代わりに使用することができます::

def ChuckNorrisCase(unittest.TestCase):
    @apply_patches
    def test_chuck_pwns_none(self):
        self.assertTrue(None)

もう少し一般的です:

def composed(*decs):
    def deco(f):
        for dec in reversed(decs):
            f = dec(f)
        return f
    return deco

その後、

@composed(dec1, dec2)
def some(f):
    pass

@dec1
@dec2
def some(f):
    pass






decorator