Last week I taught a course that covered Decorators in Python.
Many know how to use them, but few can write them.
These are tricky because nested functions make our brains hurt.
Here are some hints for grokking them.
1/
In short, decorators allow you to inject orthogonal behavior before or after a function is executed.
But my favorite decorator definition is related to the construction and will help you easily create them: A callable that takes a callable and returns a callable.
2/
What do I mean by "orthogonal"?
A function should do one thing. If you want to add caching or logging, it really isn't related to the function (and could be applied to multiple functions). It is "orthogonal" behavior.
3/
What is "callable that takes a callable and returns a callable"?
Remember this. It will make decorators easy. When we execute a function in Python we "call" it.
So, you could also say: A decorator is a function that takes a function and returns a function.
4/
(Although Python has other *callables* like methods, classes, lambdas, or instances with .__call__. You can implement decorators with these, but we will ignore them here.)
5/
The simplest decorator is one I call the *identity* decorator. It is a function that accepts a function and returns a function:
6/
We can decorate a function by redefining it or using Python's syntactic sugar: "@". These two snippets are equivalent:
7/
If your brain is fine with the identity decorator, let's just expand it and write the decorator like this. (Remember "a function that takes a function and returns a function".)
8/
When we decorate with this new code, the call to "add" actually calls "wrapper" which calls add ("func") when it executes.
The key point is that we can inject logic before "func" and after. (See blue and orange in the image.)
9/
To make a caching decorator, insert the logic to look for a prior answer in #before, and stick the result of the function in the cache in #after.
The final bit with @wraps(func) updates .__name__ and .__doc__ so that code completion works in editors and you can pull up documentation.
11/
If you enjoyed this, follow me for more Python insights.
I have a book, Intermediate Python Programming, covering decorators and other fun constructs like generators, comprehensions, and functional programming. It is 30% off today.
XGBoost is a popular machine learning algorithm that provides excellent performance out of the box for various types of machine learning problems, including regression and classification.
However, one common issue with XGBoost is overfitting, leading to poor generalization and inaccurate predictions on new data.
Overfitting occurs when the model learns the training data too well, including the noise and randomness, and cannot generalize to new data.
You can use various techniques to determine whether an XGBoost model is overfitting, including cross-validation, regularization, and monitoring the training and validation errors.
Many know how to use them, but few can write them.
These are tricky because nested functions make our brains hurt.
Here are some hints for grokking them.
1/
In short, decorators allow you to inject orthogonal behavior before or after a function is executed.
But my favorite decorator definition is related to the construction and will help you easily create them: A callable that takes a callable and returns a callable.
2/
What do I mean by "orthogonal"?
A function should do one thing. If you want to add caching or logging, it really isn't related to the function (and could be applied to multiple functions). It is "orthogonal" behavior.
3/
Many know how to use them, but few can write them.
These are tricky because nested functions make our brains hurt.
Here are some hints for grokking them.
1/
In short, decorators allow you to inject orthogonal behavior before or after a function is executed.
But my favorite decorator definition is related to the construction and will help you easily create them: A callable that takes a callable and returns a callable.
2/
What do I mean by "orthogonal"?
A function should do one thing. If you want to add caching or logging, it really isn't related to the function (and could be applied to multiple functions). It is "orthogonal" behavior.
3/
Many know how to use them, but few can write them.
These are tricky because nested functions make our brains hurt.
Here are some hints for grokking them.
1/
In short, decorators allow you to inject orthogonal behavior before or after a function is executed.
But my favorite decorator definition is related to the construction and will help you easily create them: A callable that takes a callable and returns a callable.
2/
What do I mean by "orthogonal"?
A function should do one thing. If you want to add caching or logging, it really isn't related to the function (and could be applied to multiple functions). It is "orthogonal" behavior.
3/