Type Flexibility Patterns
Polymorphic Function Design
Dynamic typing enables powerful polymorphic function implementations that adapt to different input types:
def universal_processor(data):
## Handles multiple data types dynamically
if isinstance(data, list):
return sum(data)
elif isinstance(data, str):
return len(data)
elif isinstance(data, dict):
return list(data.keys())
else:
return data
Type Conversion Techniques
Implicit Type Conversion
graph LR
A[Original Type] --> B[Automatic Conversion]
B --> C[New Type]
## Automatic type conversion
result = 10 + 5.5 ## Integer + Float = Float
text = "Number: " + str(42) ## Explicit conversion
Explicit Type Conversion Methods
Conversion Method |
Input Type |
Output Type |
Example |
int() |
String/Float |
Integer |
int("100") |
float() |
Integer/String |
Float |
float(42) |
str() |
Any Type |
String |
str(3.14) |
Advanced Type Flexibility Patterns
Duck Typing Principle
class Duck:
def sound(self):
return "Quack"
class Dog:
def sound(self):
return "Woof"
def make_sound(animal):
## Works with any object having 'sound' method
print(animal.sound())
## LabEx demonstrates flexible type handling
make_sound(Duck())
make_sound(Dog())
Type Hinting and Flexible Annotations
from typing import Union, List, Optional
def process_data(value: Union[int, str, List[int]]) -> Optional[int]:
## Flexible type handling with annotations
if isinstance(value, int):
return value * 2
elif isinstance(value, str):
return len(value)
return None
Error Handling in Dynamic Typing
Safe Type Checking Strategies
def safe_convert(value, target_type):
try:
return target_type(value)
except (ValueError, TypeError):
return None
## Robust type conversion
result = safe_convert("42", int) ## Successful
result = safe_convert("abc", int) ## Returns None
- Dynamic typing introduces runtime type checking
- Use type hints for documentation
- Implement explicit type conversions when precision matters