Practical Execution Patterns
Real-World Module Execution Strategies
Practical module execution patterns help developers create more efficient, modular, and maintainable Python applications.
Common Execution Patterns
graph TD
A[Execution Patterns] --> B[Singleton Modules]
A --> C[Lazy Loading]
A --> D[Configuration Management]
A --> E[Plugin Systems]
Pattern Comparison
Pattern |
Purpose |
Key Characteristics |
Singleton Module |
Ensure Single Instance |
Global state management |
Lazy Loading |
Defer Initialization |
Resource optimization |
Configuration Module |
Centralized Settings |
Environment-specific configurations |
Plugin Architecture |
Modular Extension |
Dynamic module loading |
Singleton Module Pattern
## singleton_module.py
class SingletonModule:
_instance = None
def __new__(cls):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self):
if not hasattr(self, 'initialized'):
self.data = {}
self.initialized = True
## Demonstration script
def test_singleton():
instance1 = SingletonModule()
instance2 = SingletonModule()
instance1.data['key'] = 'value'
print(instance2.data) ## Same instance, shared state
Lazy Loading Implementation
## lazy_loading.py
class LazyLoader:
def __init__(self, module_name):
self.module_name = module_name
self._module = None
def __getattr__(self, attr):
if not self._module:
self._module = __import__(self.module_name)
return getattr(self._module, attr)
## Usage example
numpy_lazy = LazyLoader('numpy')
## Module only loaded when actually used
Configuration Management Pattern
## Create configuration structure
mkdir -p config
cat > config/base.py << EOL
class BaseConfig:
DEBUG = False
DATABASE_URI = 'default_database_connection'
class DevelopmentConfig(BaseConfig):
DEBUG = True
DATABASE_URI = 'development_database_connection'
class ProductionConfig(BaseConfig):
DATABASE_URI = 'production_database_connection'
EOL
## Configuration selection script
cat > config_selector.py << EOL
import os
from config.base import BaseConfig, DevelopmentConfig, ProductionConfig
def get_config():
env = os.getenv('PYTHON_ENV', 'development')
config_map = {
'development': DevelopmentConfig,
'production': ProductionConfig
}
return config_map.get(env, BaseConfig)
current_config = get_config()
print(f"Current Configuration: {current_config.__name__}")
print(f"Database URI: {current_config.DATABASE_URI}")
EOL
## Run configuration selector
python3 config_selector.py
Plugin System Architecture
## plugin_system.py
class PluginManager:
def __init__(self):
self.plugins = {}
def register_plugin(self, name, plugin):
self.plugins[name] = plugin
def execute_plugins(self, event):
for name, plugin in self.plugins.items():
plugin.handle(event)
class BasePlugin:
def handle(self, event):
raise NotImplementedError("Plugins must implement handle method")
Key Takeaways
- Implement smart module execution patterns
- Use lazy loading for performance
- Create flexible configuration systems
- Design modular plugin architectures
LabEx encourages developers to adopt these practical execution patterns to build more sophisticated Python applications.