6

Pythonデコレータで関数を「非アクティブ化」することは可能ですか? ここに例があります:

cond = False

class C:

    if cond:
        def x(self): print "hi"

    def y(self): print "ho"

このコードを次のようにデコレータで書き直すことはできますか?:

class C:

    @cond
    def x(self): print "hi"

    def y(self): print "ho"

背景: 私たちのライブラリにはいくつかの依存関係 (matplotlib など) がオプションであり、これらはいくつかの関数 (デバッグまたはフロント) でのみ必要です。これは、一部のシステムではmatplotlibがインストールされていない他のシステムではインストールされていないことを意味しますが、両方で(コア)コードを実行する必要があります。そのため、matplotlib がインストールされていない場合は、いくつかの機能を無効にしたいと思います。そんなにエレガントな方法はありますか?

4

3 に答える 3

21

デコレータを使用して、関数を no-ops (警告をログに記録する) に変えることができます。

def conditional(cond, warning=None):
    def noop_decorator(func):
        return func  # pass through

    def neutered_function(func):
        def neutered(*args, **kw):
            if warning:
                log.warn(warning)
            return
        return neutered

    return noop_decorator if cond else neutered_function

ここconditionalにデコレータ ファクトリがあります。条件に応じて、2 つのデコレータのうちの 1 つを返します。

1 つのデコレータは単に関数をそのままにしておきます。もう 1 つのデコレータは、装飾された関数を完全に置き換え、代わりに警告を発行する関数に置き換えます。

使用する:

@conditional('matplotlib' in sys.modules, 'Please install matplotlib')
def foo(self, bar):
    pass
于 2013-07-30T11:42:28.447 に答える