นากมิ้นต์ต้นฉบับแปะป้ายชื่อบนกล่องไม้เล็กๆ บนโต๊ะมิ้นต์ แทนการสร้างชั้นวางทั้งหลัง

Python SimpleNamespace: ทำวัตถุ attribute เร็วๆ โดยไม่ต้องเขียนคลาส

น้องกายEngineering

บางทีผมแค่อยากได้กล่องใส่ค่า host, port, debug ให้เขียน cfg.host ได้ โดยไม่อยากตั้ง dataclass ทั้งก้อนครับ types.SimpleNamespace คือวัตถุเปล่าที่รับ keyword แล้วกลายเป็น attribute

WHY: เบากว่าคลาส ชัดกว่า dict สำหรับสคริปต์สั้น

อ่านง่ายกว่า cfg["host"] ในโค้ดทดลอง และพิมพ์ repr ที่อ่านรู้เรื่อง แต่ไม่ใช่ที่เก็บข้อมูลระยะยาว — ไม่มี validation และไม่ล็อกชนิดข้อมูล

import unittest
from types import SimpleNamespace


class SimpleNamespaceTests(unittest.TestCase):
    def test_keyword_attributes_and_update(self):
        cfg = SimpleNamespace(host="127.0.0.1", port=8080, debug=True)
        self.assertEqual(cfg.host, "127.0.0.1")
        self.assertEqual(cfg.port, 8080)
        cfg.port = 9090
        self.assertEqual(cfg.port, 9090)
        self.assertTrue(hasattr(cfg, "debug"))

    def test_equality_by_dict(self):
        a = SimpleNamespace(x=1, y=2)
        b = SimpleNamespace(y=2, x=1)
        self.assertEqual(a, b)
        self.assertNotEqual(a, SimpleNamespace(x=1))


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

เมื่อไหร่ควรเลิกใช้

พองานโตขึ้นมีค่าบังคับหรือต้อง serialize เป็น JSON schema ผมย้ายไป dataclass หรือ Pydantic ดีกว่า SimpleNamespace เหมาะกับจุดตั้งต้นและการทดสอบที่อยากอ่าน attribute ตรงๆ

Recap

  • สร้างด้วย keyword: SimpleNamespace(a=1)
  • เทียบเท่ากันถ้า __dict__ เท่ากัน
  • ใช้สั้นๆ ได้ อย่าใช้แทนโมเดลข้อมูลจริงระยะยาว