ในขณะที่คำตอบส่วนใหญ่บอกว่าเช่น
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
คือ "เหมือนกับ"
def f(foo=None, bar=None, **kwargs):
...etc...
นี่ไม่เป็นความจริง. ในกรณีหลังf
สามารถเรียกว่าเป็นf(23, 42)
ในขณะที่กรณีเดิมยอมรับอาร์กิวเมนต์ที่มีชื่อเท่านั้น - ไม่มีการโทรตำแหน่ง บ่อยครั้งที่คุณต้องการอนุญาตให้ผู้เรียกมีความยืดหยุ่นสูงสุดดังนั้นรูปแบบที่สองซึ่งเป็นคำตอบที่ยืนยันได้ส่วนใหญ่จึงเป็นที่นิยม: แต่นั่นไม่ใช่กรณีเสมอไป เมื่อคุณยอมรับพารามิเตอร์ทางเลือกจำนวนมากซึ่งโดยทั่วไปจะมีเพียงไม่กี่คนที่ผ่านมามันอาจเป็นความคิดที่ยอดเยี่ยม (หลีกเลี่ยงอุบัติเหตุและรหัสที่อ่านไม่ได้ที่ไซต์การโทรของคุณ!) เพื่อบังคับให้ใช้อาร์กิวเมนต์ที่มีชื่อ - threading.Thread
เป็นตัวอย่าง แบบฟอร์มแรกคือวิธีที่คุณใช้งานใน Python 2
สำนวนนั้นสำคัญมากใน Python 3 ตอนนี้มันมีรูปแบบการสนับสนุนพิเศษ: ทุก ๆ อาร์กิวเมนต์หลังจากหนึ่ง*
ในdef
ลายเซ็นคือคีย์เวิร์ดเท่านั้นนั่นคือไม่สามารถส่งผ่านเป็นอาร์กิวเมนต์ตำแหน่ง แต่เป็นชื่อที่กำหนดเท่านั้น ดังนั้นใน Python 3 คุณสามารถโค้ดข้างต้นเป็น:
def f(*, foo=None, bar=None, **kwargs):
...etc...
แท้จริงแล้วใน Python 3 คุณสามารถมีอาร์กิวเมนต์ที่เป็นคีย์เวิร์ดเท่านั้นซึ่งไม่ใช่ตัวเลือก (อันที่ไม่มีค่าเริ่มต้น)
อย่างไรก็ตาม Python 2 ยังมีชีวิตอีกหลายปีข้างหน้าดังนั้นมันจะดีกว่าที่จะไม่ลืมเทคนิคและสำนวนที่ให้คุณใช้ใน Python 2 แนวคิดการออกแบบที่สำคัญที่ได้รับการสนับสนุนโดยตรงในภาษาใน Python 3!