Aspect-oriented vs explicit style in Python
Pythonic, readable and convenient


are all subjective and open to debate, even though "Pythonic" is less so than the others. That said, a simplified version may be illustrative. Comparing

@foo
@bar
def baz(value: T) -&gt; T:
    return value


to

def baz(value: T) -&gt; FooT:
    return foo(bar(value))


there are two issues with the former:


The final return type is now hidden in foo.
It is easy to confuse the layering - is baz(value) equivalent to foo(bar(baz(value))) or bar(foo(baz(value))) (or even baz(foo(bar(value))) in case of a novice)? Nested decorators come up so rarely that I would have to look at the documentation to be absolutely sure whether they were in the right sequence.


There seems to be two situations where multi-level decorators would be fine:


If they pass through the return value unchanged. A logger would be a typical example.
If the decorators are commutative, that is, their order doesn't matter for the outcome.