Python 3.13+copyфункция
copy.replace()
замена полей
Создаёт копию объекта того же типа с заменой части полей. Работает с dataclass, namedtuple, datetime и любым классом с __replace__.
Синтаксис
copy.replace(obj, /, **changes)
Это общий фасад: copy.replace(obj, **changes) просто вызывает obj.__replace__(**changes), поэтому один код меняет поля и у dataclass, и у namedtuple (вместо _replace), и у date/datetime. Обычный класс без __replace__ даёт TypeError, а не поверхностную копию — для этого есть copy.copy. Неизвестное имя поля — тоже TypeError, у dataclass нельзя передать поле с init=False. Копия поверхностная: вложенные списки остаются общими. Появилась в 3.13; на старых версиях — dataclasses.replace или _replace.
Примеры
import copy
from collections import namedtuple
from dataclasses import dataclass
Point = namedtuple('Point', 'x y')
@dataclass(frozen=True)
class User:
name: str
age: int
print(copy.replace(Point(1, 2), y=5)) # → Point(x=1, y=5)
print(copy.replace(User('Ann', 30), age=31)) # → User(name='Ann', age=31)
import copy
class Plain:
pass
try:
copy.replace(Plain())
except TypeError as e:
print(e) # → replace() does not support Plain objects
import copy
class Money:
def __init__(self, amount, currency):
self.amount, self.currency = amount, currency
def __replace__(self, **changes):
return Money(changes.get('amount', self.amount), changes.get('currency', self.currency))
m = copy.replace(Money(10, 'RUB'), amount=25)
print(m.amount, m.currency) # → 25 RUB
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности