18 lines
586 B
Python
18 lines
586 B
Python
from django.utils.version import PY313
|
|
|
|
if PY313:
|
|
from copy import replace
|
|
else:
|
|
# Backport of copy.replace() from Python 3.13.
|
|
def replace(obj, /, **changes):
|
|
"""Return a new object replacing specified fields with new values.
|
|
|
|
This is especially useful for immutable objects, like named tuples or
|
|
frozen dataclasses.
|
|
"""
|
|
cls = obj.__class__
|
|
func = getattr(cls, "__replace__", None)
|
|
if func is None:
|
|
raise TypeError(f"replace() does not support {cls.__name__} objects")
|
|
return func(obj, **changes)
|