Implementing more complex descriptors
We can easily write the following commands:
@f_wrap @g_wrap def h(x): something
There's nothing in Python to stop us. This has a meaning somewhat like . However, the name is merely . Because of this potential confusion, we need to be cautious when creating functions that involve deeply nested descriptors. If our intent is simply to handle some cross-cutting concerns, then each decorator can handle a concern without creating much confusion.
If, on the other hand, we're using a decoration to create a composite function, it might also be better to use the following command:
f_g_h= f_wrap(g_wrap(h))
This clarifies as to what precisely is going on. Decorator functions don't correspond precisely with the mathematical abstraction of functions being composed. The decorator function actually contains a wrapper function that will contain the function being composed. This distinction between a function and a decorator that creates a composite from the function...