Practical Use Cases
Real-World Function Introspection Applications
Function introspection provides powerful capabilities for solving complex programming challenges across various domains.
Automatic Serialization System
import json
import inspect
class AutoSerializer:
@classmethod
def serialize(cls, obj):
"""Dynamically serialize objects based on their attributes."""
serialized_data = {}
for name, method in inspect.getmembers(obj):
if not name.startswith('__') and not inspect.ismethod(method):
serialized_data[name] = getattr(obj, name)
return json.dumps(serialized_data)
class User:
def __init__(self, name, age, email):
self.name = name
self.age = age
self.email = email
## Demonstration
user = User("Alice", 30, "[email protected]")
serialized_user = AutoSerializer.serialize(user)
print(serialized_user)
Use Case Categories
graph TD
A[Introspection Use Cases] --> B[Serialization]
A --> C[Validation]
A --> D[Dynamic Programming]
A --> E[Testing]
B --> F[Object Conversion]
C --> G[Type Checking]
D --> H[Plugin Systems]
E --> I[Automated Testing]
Plugin Management System
import inspect
class PluginManager:
def __init__(self):
self.plugins = {}
def register_plugin(self, plugin_class):
"""Automatically detect and register plugin methods."""
plugin_methods = {
name: method for name, method in inspect.getmembers(plugin_class, inspect.isfunction)
if not name.startswith('__')
}
self.plugins[plugin_class.__name__] = plugin_methods
def list_available_plugins(self):
return list(self.plugins.keys())
class ImageProcessor:
def resize_image(self, image):
print("Resizing image")
def apply_filter(self, image):
print("Applying filter")
## Plugin management demonstration
plugin_manager = PluginManager()
plugin_manager.register_plugin(ImageProcessor)
print(plugin_manager.list_available_plugins())
Validation Decorator
import functools
import inspect
def validate_types(*type_args, **type_kwargs):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
sig = inspect.signature(func)
bound_arguments = sig.bind(*args, **kwargs)
bound_arguments.apply_defaults()
for param_name, param_value in bound_arguments.arguments.items():
expected_type = type_args[list(sig.parameters).index(param_name)] if param_name in sig.parameters else type_kwargs.get(param_name)
if expected_type and not isinstance(param_value, expected_type):
raise TypeError(f"Argument {param_name} must be {expected_type}")
return func(*args, **kwargs)
return wrapper
return decorator
@validate_types(str, int)
def create_user(name, age):
print(f"Creating user {name} with age {age}")
## Demonstration
create_user("Alice", 30) ## Valid
## create_user(123, "30") ## Would raise TypeError
import time
import functools
import inspect
def performance_monitor(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Function: {func.__name__}")
print(f"Arguments: {inspect.signature(func).bind(*args, **kwargs).arguments}")
print(f"Execution Time: {end_time - start_time} seconds")
return result
return wrapper
@performance_monitor
def complex_calculation(n):
return sum(i**2 for i in range(n))
complex_calculation(10000)
Practical Use Case Summary
Use Case |
Description |
Key Benefit |
Serialization |
Convert objects to portable formats |
Dynamic data transfer |
Validation |
Enforce type and structure constraints |
Improved code reliability |
Plugin Management |
Dynamically load and manage components |
Flexible system architecture |
Performance Monitoring |
Track function execution details |
Optimization insights |
LabEx Insight
At LabEx, we leverage these introspection techniques to create adaptive learning environments that demonstrate the power of dynamic Python programming.