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 ที่อาจไม่มี