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