นากกายใช้คีมคีบป้ายชื่อฟิลด์จากกล่องออบเจ็กต์บนโต๊ะมิ้นต์

operator.attrgetter: ดึงฟิลด์เรียง/แมปโดยไม่เขียน lambda ซ้ำ

น้องกายEngineering

เวลา sorted(..., key=lambda x: x.name) เยอะ ๆ ผมเปลี่ยนเป็น operator.attrgetter ครับ อ่านง่ายและรองรับ dotted path

ตามเอกสาร ส่งชื่อฟิลด์หนึ่งตัวได้ค่าเดียว ส่งหลายชื่อได้ออกเป็นทูเพิล

from operator import attrgetter
from types import SimpleNamespace
import unittest

class AttrGetterTests(unittest.TestCase):
    def test_sort_and_nested(self):
        rows = [
            SimpleNamespace(name="b", meta=SimpleNamespace(score=2)),
            SimpleNamespace(name="a", meta=SimpleNamespace(score=9)),
        ]
        by_name = sorted(rows, key=attrgetter("name"))
        self.assertEqual([r.name for r in by_name], ["a", "b"])
        scores = list(map(attrgetter("meta.score"), rows))
        self.assertEqual(scores, [2, 9])

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

ใช้ตอนเรียงรายงาน, เลือกคอลัมน์จาก dataclass/ORM object — ถ้าฟิลด์อาจหาย ยังต้องกัน AttributeError เอง

Recap

  • แทน lambda x: x.field ด้วย attrgetter("field")
  • ใช้ dotted path เช่น meta.score เมื่อโครงสร้างซ้อน
  • อ่านเอกสาร operator
  • อย่าลืมกัน attribute ที่อาจไม่มี