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__เท่ากัน - ใช้สั้นๆ ได้ อย่าใช้แทนโมเดลข้อมูลจริงระยะยาว