งูสีเขียวต้นฉบับกำลังเสียบชิ้นไม้สองชิ้นลงช่องว่างกลางแม่แบบสีครีม

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 เริ่มอ่านยาก