Safely create a deep copy of an object, handling special cases. Args: obj: Object to copy Returns: Deep copy of the object Raises: DeepCopyError: If object cannot be deep copied
(obj: Any)
| 33 | |
| 34 | |
| 35 | def safe_deepcopy(obj: Any) -> Any: |
| 36 | """ |
| 37 | Safely create a deep copy of an object, handling special cases. |
| 38 | |
| 39 | Args: |
| 40 | obj: Object to copy |
| 41 | |
| 42 | Returns: |
| 43 | Deep copy of the object |
| 44 | |
| 45 | Raises: |
| 46 | DeepCopyError: If object cannot be deep copied |
| 47 | """ |
| 48 | try: |
| 49 | # Handle special cases first |
| 50 | if obj is None or isinstance(obj, (str, int, float, bool)): |
| 51 | return obj |
| 52 | |
| 53 | if isinstance(obj, (list, set)): |
| 54 | return type(obj)(safe_deepcopy(v) for v in obj) |
| 55 | |
| 56 | if isinstance(obj, dict): |
| 57 | return {k: safe_deepcopy(v) for k, v in obj.items()} |
| 58 | |
| 59 | if isinstance(obj, tuple): |
| 60 | return tuple(safe_deepcopy(v) for v in obj) |
| 61 | |
| 62 | if isinstance(obj, frozenset): |
| 63 | return frozenset(safe_deepcopy(v) for v in obj) |
| 64 | |
| 65 | if is_boto3_client(obj): |
| 66 | return obj |
| 67 | |
| 68 | return copy.copy(obj) |
| 69 | |
| 70 | except Exception as e: |
| 71 | raise DeepCopyError(f"Cannot deep copy object of type {type(obj)}") from e |