นักพัฒนา Python กำลังแสดงความไม่พอใจต่อการจัดการกลุ่มอาร์กิวเมนต์ที่แยกกันโดยสิ้นเชิงของไลบรารี argparse โดยเฉพาะเมื่อต้องจัดการกับการกำหนดค่า timeout ที่ซับซ้อน การอภิปรายนี้มุ่งเน้นไปที่สถานการณ์การเขียนโปรแกรมทั่วไปที่นักพัฒนาต้องการสร้างเครื่องมือ command-line ที่สามารถรับค่า timeout หลายค่าที่เฉพาะเจาะจงหรือปิดการใช้งาน timeout ทั้งหมดด้วยแฟล็กเดียว
ความขัดแย้งในปรัชญาการออกแบบ
ปัญหาหลักเกิดจากการตีความกลุ่มที่แยกกันโดยสิ้นเชิงของ argparse อย่างเข้มงวด นักพัฒนาต้องการสร้างอินเทอร์เฟซที่ผู้ใช้สามารถระบุ timeout แต่ละตัวเช่น --foo-timeout=5 --bar-timeout=10
หรือใช้แฟล็กส่วนกลาง --no-timeouts
เพื่อปิดการใช้งานทุกอย่างในครั้งเดียว อย่างไรก็ตาม argparse ถือว่านี่เป็นข้อจำกัดมากกว่าคำขอฟีเจอร์
สมาชิกชุมชนกำลังตั้งคำถามว่าสิ่งนี้แสดงถึงข้อบกพร่องในการออกแบบพื้นฐานหรือไม่ บางคนโต้แย้งว่าการแก้ปัญหาที่แท้จริงอยู่ที่การคิดใหม่ทั้งหมด โดยแนะนำว่า --foo-timeout=0
สามารถใช้เป็นวิธีธรรมชาติในการปิดการใช้งาน timeout แต่ละตัวแทนที่จะบังคับให้ใช้วิธีทั้งหมดหรือไม่มีเลยผ่านกลุ่มที่แยกกันโดยสิ้นเชิง
แนวทางการแก้ไขปัญหาทั่วไป:
- ใช้
--timeout=0
เพื่อปิดการใช้งาน timeout แต่ละตัวแทนที่จะใช้กลุ่มที่ไม่สามารถใช้ร่วมกันได้ - ใช้ logic แบบกำหนดเองเพื่อติดตามแหล่งที่มาของ argument (ค่าจากผู้ใช้เทียบกับค่าเริ่มต้น)
- พิจารณาใช้ library อื่นเช่น Click สำหรับสถานการณ์ที่ซับซ้อน
- สร้างกลุ่ม argument แบบโปรแกรมโดยใช้ฟังก์ชัน
- ใช้กลุ่มแบบซ้อน (แม้ว่าอาจถูกยกเลิกการใช้งานในเวอร์ชันอนาคต)
ความท้าทายในการจัดลำดับความสำคัญของการกำหนดค่า
ความกังวลสำคัญที่นักพัฒนาหยิบยกขึ้นมาเกี่ยวข้องกับการติดตามว่าอาร์กิวเมนต์มาจากการป้อนข้อมูลของผู้ใช้หรือค่าเริ่มต้น การแยกแยะนี้มีความสำคัญอย่างยิ่งเมื่อใช้งานลำดับชั้นการกำหนดค่าที่ค่าเริ่มต้นของโปรแกรมควรถูกแทนที่ด้วยไฟล์กำหนดค่า ซึ่งจากนั้นควรถูกแทนที่ด้วยอาร์กิวเมนต์ command-line
การใช้งาน argparse ปัจจุบันทำให้ยากต่อการกำหนดแหล่งที่มาของค่าอาร์กิวเมนต์ ทำให้การพัฒนาระบบกำหนดค่าที่แข็งแกร่งซับซ้อนขึ้น แม้ว่าจะมีวิธีแก้ไขชั่วคราว แต่มักต้องใช้ความซับซ้อนเพิ่มเติมและตรรกะที่กำหนดเองซึ่งนักพัฒนารู้สึกว่าควรจะถูกจัดการโดยไลบรารีโดยธรรมชาติ
ลำดับความสำคัญของการกำหนดค่า:
- ค่าเริ่มต้นของโปรแกรม (ความสำคัญต่ำสุด)
- ไฟล์การกำหนดค่า
- อาร์กิวเมนต์บรรทัดคำสั่ง
- การเปลี่ยนแปลงการกำหนดค่าขณะทำงาน (ความสำคัญสูงสุด)
โซลูชันทางเลือกและวิธีแก้ไขชั่วคราว
แม้จะมีข้อจำกัด แต่นักพัฒนาบางคนได้พบโซลูชันที่สร้างสรรค์ มีรายงานว่า Google Cloud CLI จัดการสถานการณ์ที่คล้ายกันโดยใช้กลุ่มอาร์กิวเมนต์ที่ซ้อนกัน แม้ว่าวิธีการนี้อาจอาศัยฟีเจอร์ที่ไม่มีเอกสารซึ่งอาจถูกเอาออกในเวอร์ชันอนาคต
gcloud CLI จัดการสิ่งนี้โดยใช้ argparse มีกลุ่ม mutex หลักที่มีแฟล็ก —no-timeout ลูกหนึ่งตัว และจากนั้นมีกลุ่มลูกที่ประกอบด้วยแฟล็ก timeout
คำแนะนำอื่น ๆ รวมถึงการใช้ไลบรารีทางเลือกเช่น Click ซึ่งอาจให้ความยืดหยุ่นมากขึ้นสำหรับสถานการณ์การแยกวิเคราะห์อาร์กิวเมนต์ที่ซับซ้อน อย่างไรก็ตาม การเปลี่ยนไลบรารีไม่ใช่เรื่องที่ปฏิบัติได้เสมอไปสำหรับโปรเจ็กต์ที่มีอยู่หรือทีมที่ใช้มาตรฐาน argparse
บทสรุป
การอภิปรายนี้เน้นย้ำถึงความตึงเครียดที่กว้างขึ้นในการออกแบบซอฟต์แวร์ระหว่างความเรียบง่ายและความยืดหยุ่น ในขณะที่ argparse ให้บริการกรณีการใช้งานพื้นฐานส่วนใหญ่ได้ดี นักพัฒนาที่ทำงานกับอินเทอร์เฟซ command-line ที่ซับซ้อนมากขึ้นพบว่าตัวเองต้องต่อสู้กับข้อจำกัดของไลบรารีมากกว่าที่จะได้รับการเสริมพลังจากฟีเจอร์ของมัน ในขณะที่ Python ยังคงพัฒนาต่อไป การอภิปรายเหล่านี้อาจมีอิทธิพลต่อการปรับปรุงความสามารถในการแยกวิเคราะห์อาร์กิวเมนต์ในอนาคตหรือผลักดันให้มีการใช้งานโซลูชันทางเลือก