Python Glossary English

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Сообщить о неточности