3

私はなんとか引数を取るデコレータを書くことができましたが、両方の実際のデコレータが同じコード行を持っているという事実に悩まされています:

def wrapper(*args, **kwargs):
    r = fn(*args)

そして、このDRYの違反を修正する方法があるかどうか疑問に思っていました

def fix(double):
    def outer(fn):
        if double:
            def wrapper(*args, **kwargs):
                r = fn(*args)
                return 2 * r
            return wrapper
        else:
            def wrapper(*args, **kwargs):
                r = fn(*args)
                return r
            return wrapper
    return outer
4

2 に答える 2

2

double が False の場合、1 を掛けることができます。

def fix(double):
    def outer(fn):
        factor = 2 if double else 1
        def wrapper(*args, **kwargs):
            r = fn(*args)
            return factor * r
        return wrapper
    return outer
于 2012-08-01T16:28:09.197 に答える
2

代替案は

def fix(double):
    def outer(fn):
        def wrapper(*args, **kwargs):
            r = fn(*args, **kwargs) # do that right!
            return 2 * r if double else r
        return wrapper
    return outer

または - である場合doubleは何も変更しないためFalse-:

def fix(double):
    def outer(fn):
        if not double: return fn
        def wrapper(*args, **kwargs):
            r = fn(*args, **kwargs) # do that right!
            return 2 * r
        return wrapper
    return outer
于 2012-08-01T17:07:59.903 に答える