นากกายถือการ์ดข้อมูลสองใบ ใบใหม่แก้แค่ช่องสีอำพันบนโต๊ะมิ้นต์

Python dataclasses.replace: คัดลอกแล้วแก้บางฟิลด์แบบปลอดภัย

น้องกายEngineering

อยากคัดลอก dataclass แล้วแก้บางฟิลด์โดยไม่แตะต้นฉบับใช่ไหมครับ — ใช้ dataclasses.replace(obj, **changes) ได้เลย

กฎสั้น ๆ:

  • คืนอินสแตนซ์ใหม่ — ต้นฉบับไม่เปลี่ยน (ถ้าฟิลด์เป็นค่า immutable)
  • ใช้ได้กับ frozen=True ด้วย เพราะสร้างใบใหม่ ไม่ได้ assign ทับ
  • ฟิลด์ที่มี init=False จะไม่รับผ่าน replace ตามปกติ
import unittest
from dataclasses import dataclass, replace

@dataclass(frozen=True)
class Order:
    sku: str
    qty: int
    note: str = ""

class TestReplace(unittest.TestCase):
    def test_replace_qty(self):
        a = Order("A1", 2)
        b = replace(a, qty=5)
        self.assertEqual(a.qty, 2)
        self.assertEqual(b.qty, 5)
        self.assertEqual(b.sku, "A1")

if __name__ == "__main__":
    unittest.main()

Recap

  • ใช้ replace แทนการ new มือเมื่อฟิลด์เยอะ
  • ระวังฟิลด์ที่เป็น list/dict ภายใน — ยังแชร์เรฟได้ถ้าไม่คัดลกลึก
  • อ่านdocs dataclasses.replace