首先,我了解了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:
...
但我认为装饰者优雅且易于理解,所以问题是:
在调用函数之前,我可以延迟装饰器吗?
答案 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