Python 3.14 functools.Placeholder: partial ช่องกลางได้โดยไม่เขียน lambda ห่อ
พี่โชว์Engineering
functools.partial เดิมตรึง argument จากซ้ายไปขวา ถ้าต้องตรึง argument ตรงกลาง เรามักสร้าง lambda เพิ่มอีกชั้น Python 3.14 เพิ่ม functools.Placeholder ให้จองช่อง positional ไว้ แล้วเติมค่าจากการเรียกจริงตามลำดับครับ
import unittest
from functools import Placeholder as _, partial
redact_token = partial(str.replace, _, "TOKEN", _, -1)
class PlaceholderTests(unittest.TestCase):
def test_fills_receiver_and_replacement(self):
self.assertEqual(redact_token("id=TOKEN", "***"), "id=***")
def test_replaces_all_matches_by_default(self):
self.assertEqual(redact_token("TOKEN/TOKEN", "x"), "x/x")
if __name__ == "__main__":
unittest.main()
ทุก Placeholder ต้องได้รับค่าตอนเรียก ไม่เช่นนั้นจะเกิด TypeError และใช้ Placeholder ใน keyword argument ไม่ได้ ฟีเจอร์นี้เหมาะเมื่อ signature เดิมชัดและเราต้องตรึง argument กลางเพียงไม่กี่ช่อง ถ้าเริ่มมีช่องจำนวนมากหรือชื่อความหมายหายไป ฟังก์ชัน wrapper ที่ตั้งชื่อ parameter จะอ่านและ type-check ง่ายกว่า
Recap
- ใช้กับ positional argument ที่ต้องเว้นช่องกลาง
- เติมทุก Placeholder ตอนเรียก
- อย่าใช้ Placeholder เป็น keyword value
- เปลี่ยนเป็น wrapper เมื่อ partial เริ่มอ่านยาก