@@ -71,6 +71,7 @@ except ImportError:
71
71
from .errors import (
72
72
Error,
73
73
NoSuchProviderError,
74
+ NonCopyableArgumentError,
74
75
)
75
76
76
77
cimport cython
@@ -1252,8 +1253,8 @@ cdef class Callable(Provider):
1252
1253
1253
1254
copied = _memorized_duplicate(self , memo)
1254
1255
copied.set_provides(_copy_if_provider(self .provides, memo))
1255
- copied.set_args(* deepcopy( self .args, memo))
1256
- copied.set_kwargs(** deepcopy( self .kwargs, memo))
1256
+ copied.set_args(* deepcopy_args( self , self .args, memo))
1257
+ copied.set_kwargs(** deepcopy_kwargs( self , self .kwargs, memo))
1257
1258
self ._copy_overridings(copied, memo)
1258
1259
return copied
1259
1260
@@ -2539,8 +2540,8 @@ cdef class Factory(Provider):
2539
2540
2540
2541
copied = _memorized_duplicate(self , memo)
2541
2542
copied.set_provides(_copy_if_provider(self .provides, memo))
2542
- copied.set_args(* deepcopy( self .args, memo))
2543
- copied.set_kwargs(** deepcopy( self .kwargs, memo))
2543
+ copied.set_args(* deepcopy_args( self , self .args, memo))
2544
+ copied.set_kwargs(** deepcopy_kwargs( self , self .kwargs, memo))
2544
2545
copied.set_attributes(** deepcopy(self .attributes, memo))
2545
2546
self ._copy_overridings(copied, memo)
2546
2547
return copied
@@ -2838,8 +2839,8 @@ cdef class BaseSingleton(Provider):
2838
2839
2839
2840
copied = _memorized_duplicate(self , memo)
2840
2841
copied.set_provides(_copy_if_provider(self .provides, memo))
2841
- copied.set_args(* deepcopy( self .args, memo))
2842
- copied.set_kwargs(** deepcopy( self .kwargs, memo))
2842
+ copied.set_args(* deepcopy_args( self , self .args, memo))
2843
+ copied.set_kwargs(** deepcopy_kwargs( self , self .kwargs, memo))
2843
2844
copied.set_attributes(** deepcopy(self .attributes, memo))
2844
2845
self ._copy_overridings(copied, memo)
2845
2846
return copied
@@ -3451,7 +3452,7 @@ cdef class List(Provider):
3451
3452
return copied
3452
3453
3453
3454
copied = _memorized_duplicate(self , memo)
3454
- copied.set_args(* deepcopy( self .args, memo))
3455
+ copied.set_args(* deepcopy_args( self , self .args, memo))
3455
3456
self ._copy_overridings(copied, memo)
3456
3457
return copied
3457
3458
@@ -3674,8 +3675,8 @@ cdef class Resource(Provider):
3674
3675
3675
3676
copied = _memorized_duplicate(self , memo)
3676
3677
copied.set_provides(_copy_if_provider(self .provides, memo))
3677
- copied.set_args(* deepcopy( self .args, memo))
3678
- copied.set_kwargs(** deepcopy( self .kwargs, memo))
3678
+ copied.set_args(* deepcopy_args( self , self .args, memo))
3679
+ copied.set_kwargs(** deepcopy_kwargs( self , self .kwargs, memo))
3679
3680
3680
3681
self ._copy_overridings(copied, memo)
3681
3682
@@ -4525,8 +4526,8 @@ cdef class MethodCaller(Provider):
4525
4526
4526
4527
copied = _memorized_duplicate(self , memo)
4527
4528
copied.set_provides(_copy_if_provider(self .provides, memo))
4528
- copied.set_args(* deepcopy( self .args, memo))
4529
- copied.set_kwargs(** deepcopy( self .kwargs, memo))
4529
+ copied.set_args(* deepcopy_args( self , self .args, memo))
4530
+ copied.set_kwargs(** deepcopy_kwargs( self , self .kwargs, memo))
4530
4531
self ._copy_overridings(copied, memo)
4531
4532
return copied
4532
4533
@@ -4927,6 +4928,48 @@ cpdef object deepcopy(object instance, dict memo=None):
4927
4928
return copy.deepcopy(instance, memo)
4928
4929
4929
4930
4931
+ cpdef tuple deepcopy_args(
4932
+ Provider provider,
4933
+ tuple args,
4934
+ dict [int , object ] memo = None ,
4935
+ ):
4936
+ """ A wrapper for deepcopy for positional arguments.
4937
+
4938
+ Used to improve debugability of objects that cannot be deep-copied.
4939
+ """
4940
+
4941
+ cdef list [object ] out = []
4942
+
4943
+ for i, arg in enumerate (args):
4944
+ try :
4945
+ out.append(copy.deepcopy(arg, memo))
4946
+ except Exception as e:
4947
+ raise NonCopyableArgumentError(provider, index = i) from e
4948
+
4949
+ return tuple (out)
4950
+
4951
+
4952
+ cpdef dict [str , object ] deepcopy_kwargs(
4953
+ Provider provider,
4954
+ dict [str , object ] kwargs,
4955
+ dict [int , object ] memo = None ,
4956
+ ):
4957
+ """ A wrapper for deepcopy for keyword arguments.
4958
+
4959
+ Used to improve debugability of objects that cannot be deep-copied.
4960
+ """
4961
+
4962
+ cdef dict [str , object ] out = {}
4963
+
4964
+ for name, arg in kwargs.items():
4965
+ try :
4966
+ out[name] = copy.deepcopy(arg, memo)
4967
+ except Exception as e:
4968
+ raise NonCopyableArgumentError(provider, keyword = name) from e
4969
+
4970
+ return out
4971
+
4972
+
4930
4973
def __add_sys_streams (memo ):
4931
4974
""" Add system streams to memo dictionary.
4932
4975
0 commit comments