@@ -71,6 +71,7 @@ except ImportError:
7171from .errors import (
7272 Error,
7373 NoSuchProviderError,
74+ NonCopyableArgumentError,
7475)
7576
7677cimport cython
@@ -1252,8 +1253,8 @@ cdef class Callable(Provider):
12521253
12531254 copied = _memorized_duplicate(self , memo)
12541255 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))
12571258 self ._copy_overridings(copied, memo)
12581259 return copied
12591260
@@ -2539,8 +2540,8 @@ cdef class Factory(Provider):
25392540
25402541 copied = _memorized_duplicate(self , memo)
25412542 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))
25442545 copied.set_attributes(** deepcopy(self .attributes, memo))
25452546 self ._copy_overridings(copied, memo)
25462547 return copied
@@ -2838,8 +2839,8 @@ cdef class BaseSingleton(Provider):
28382839
28392840 copied = _memorized_duplicate(self , memo)
28402841 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))
28432844 copied.set_attributes(** deepcopy(self .attributes, memo))
28442845 self ._copy_overridings(copied, memo)
28452846 return copied
@@ -3451,7 +3452,7 @@ cdef class List(Provider):
34513452 return copied
34523453
34533454 copied = _memorized_duplicate(self , memo)
3454- copied.set_args(* deepcopy( self .args, memo))
3455+ copied.set_args(* deepcopy_args( self , self .args, memo))
34553456 self ._copy_overridings(copied, memo)
34563457 return copied
34573458
@@ -3674,8 +3675,8 @@ cdef class Resource(Provider):
36743675
36753676 copied = _memorized_duplicate(self , memo)
36763677 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))
36793680
36803681 self ._copy_overridings(copied, memo)
36813682
@@ -4525,8 +4526,8 @@ cdef class MethodCaller(Provider):
45254526
45264527 copied = _memorized_duplicate(self , memo)
45274528 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))
45304531 self ._copy_overridings(copied, memo)
45314532 return copied
45324533
@@ -4927,6 +4928,48 @@ cpdef object deepcopy(object instance, dict memo=None):
49274928 return copy.deepcopy(instance, memo)
49284929
49294930
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+
49304973def __add_sys_streams (memo ):
49314974 """ Add system streams to memo dictionary.
49324975
0 commit comments