在调用函数之前,我可以延迟装饰器吗?

时间:2012-05-28 12:30:11

标签: python decorator

首先,我了解了Python装饰器是什么以及它们是如何工作的。我希望它能做到这样的事情:

def age_over_18(go_enjoy_yourself):

    def go_home_and_rethink_your_life():

        return 'So you should go home and rethink your life.'

    return go_enjoy_yourself if age_stored_somewhere > 18 else go_home_and_rethink_your_life

@age_over_18
def some_porn_things():

    return '-Beep-'

但我发现装饰器是在Python首次读取函数时执行的,这意味着该函数实际上什么也不做。

我知道我可以这样写:

def some_porn_things():

    if age_stored_somewhere > 18:
        ...
    else:
        ...

但我认为装饰者优雅且易于理解,所以问题是:

在调用函数之前,我可以延迟装饰器吗?

1 个答案:

答案 0 :(得分:7)

诀窍就是确保检查发生在内部函数中,而不是外部函数中。在你的情况下:

def age_over_18(go_enjoy_yourself):
    def are_you_over_18():
        if age > 18:
            return go_enjoy_yourself()
        else:
            return 'So you should go home and rethink your life.'

    return are_you_over_18