2727 get_args ,
2828)
2929
30- try :
31- BaseExceptionGroup = BaseExceptionGroup
32- ExceptionGroup = ExceptionGroup # pragma: no cover
33- except NameError :
30+ if sys . version_info >= ( 3 , 11 ) :
31+ BaseExceptionGroup = BaseExceptionGroup # noqa: F821
32+ ExceptionGroup = ExceptionGroup # noqa: F821
33+ else : # pragma: no cover
3434 from exceptiongroup import (
3535 BaseExceptionGroup as BaseExceptionGroup ,
3636 ExceptionGroup as ExceptionGroup ,
4747 # In order to use NotRequired, we need the version of TypedDict included in Python 3.11+.
4848 if sys .version_info [:2 ] >= (3 , 11 ):
4949 from typing import NotRequired as NotRequired , TypedDict as TypedDict
50- else :
50+ else : # pragma: no cover
5151 try :
5252 from typing_extensions import (
5353 NotRequired as NotRequired ,
@@ -65,7 +65,7 @@ def __class_getitem__(cls, item):
6565 from typing import (
6666 override as override ,
6767 )
68- except ImportError :
68+ except ImportError : # pragma: no cover
6969 try :
7070 from typing_extensions import (
7171 override as override ,
@@ -83,7 +83,7 @@ def __class_getitem__(cls, item):
8383def add_note (exc , note ):
8484 try :
8585 exc .add_note (note )
86- except AttributeError :
86+ except AttributeError : # pragma: no cover
8787 if not hasattr (exc , "__notes__" ):
8888 try :
8989 exc .__notes__ = []
@@ -251,6 +251,31 @@ def bad_django_TestCase(runner: Optional["ConjectureRunner"]) -> bool:
251251# see issue #3812
252252if sys .version_info [:2 ] < (3 , 12 ):
253253
254+ def _asdict_inner (obj , dict_factory ):
255+ if dataclasses ._is_dataclass_instance (obj ):
256+ return dict_factory (
257+ (f .name , _asdict_inner (getattr (obj , f .name ), dict_factory ))
258+ for f in dataclasses .fields (obj )
259+ )
260+ elif isinstance (obj , tuple ) and hasattr (obj , "_fields" ):
261+ return type (obj )(* [_asdict_inner (v , dict_factory ) for v in obj ])
262+ elif isinstance (obj , (list , tuple )):
263+ return type (obj )(_asdict_inner (v , dict_factory ) for v in obj )
264+ elif isinstance (obj , dict ):
265+ if hasattr (type (obj ), "default_factory" ):
266+ result = type (obj )(obj .default_factory )
267+ for k , v in obj .items ():
268+ result [_asdict_inner (k , dict_factory )] = _asdict_inner (
269+ v , dict_factory
270+ )
271+ return result
272+ return type (obj )(
273+ (_asdict_inner (k , dict_factory ), _asdict_inner (v , dict_factory ))
274+ for k , v in obj .items ()
275+ )
276+ else :
277+ return copy .deepcopy (obj )
278+
254279 def dataclass_asdict (obj , * , dict_factory = dict ):
255280 """
256281 A vendored variant of dataclasses.asdict. Includes the bugfix for
@@ -267,30 +292,6 @@ def dataclass_asdict(obj, *, dict_factory=dict):
267292 dataclass_asdict = dataclasses .asdict
268293
269294
270- def _asdict_inner (obj , dict_factory ):
271- if dataclasses ._is_dataclass_instance (obj ):
272- return dict_factory (
273- (f .name , _asdict_inner (getattr (obj , f .name ), dict_factory ))
274- for f in dataclasses .fields (obj )
275- )
276- elif isinstance (obj , tuple ) and hasattr (obj , "_fields" ):
277- return type (obj )(* [_asdict_inner (v , dict_factory ) for v in obj ])
278- elif isinstance (obj , (list , tuple )):
279- return type (obj )(_asdict_inner (v , dict_factory ) for v in obj )
280- elif isinstance (obj , dict ):
281- if hasattr (type (obj ), "default_factory" ):
282- result = type (obj )(obj .default_factory )
283- for k , v in obj .items ():
284- result [_asdict_inner (k , dict_factory )] = _asdict_inner (v , dict_factory )
285- return result
286- return type (obj )(
287- (_asdict_inner (k , dict_factory ), _asdict_inner (v , dict_factory ))
288- for k , v in obj .items ()
289- )
290- else :
291- return copy .deepcopy (obj )
292-
293-
294295if sys .version_info [:2 ] < (3 , 13 ):
295296 # batched was added in 3.12, strict flag in 3.13
296297 # copied from 3.13 docs reference implementation
0 commit comments