Python is a versatile and powerful programming language, and two of its most useful features are decorators and closures. These concepts can seem a bit daunting at first, but once you understand how they work, they can become powerful tools in your Python toolkit.
What are Decorators?
Decorators are a way to modify the behavior of a function without changing its source code. They are defined using the @
symbol, followed by the decorator function, placed just before the function definition. Here's a simple example of a decorator that logs the arguments passed to a function:
def log_args(func):
def wrapper(*args, **kwargs):
print(f"Calling {func.__name__} with args={args} and kwargs={kwargs}")
return func(*args, **kwargs)
return wrapper
@log_args
def add_numbers(a, b):
return a + b
result = add_numbers(2, 3)
# Output: Calling add_numbers with args=(2, 3) and kwargs={}
# Result: 5
In this example, the log_args
decorator wraps the add_numbers
function, adding the logging functionality without modifying the original function.