ไลบรารี argparse ของ Python ถูกวิพากษ์วิจารณ์เรื่องข้อจำกัดของกลุ่มอาร์กิวเมนต์ที่แยกกันโดยสิ้นเชิง

ทีมบรรณาธิการ BigGo
ไลบรารี argparse ของ Python ถูกวิพากษ์วิจารณ์เรื่องข้อจำกัดของกลุ่มอาร์กิวเมนต์ที่แยกกันโดยสิ้นเชิง

นักพัฒนา 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 ปัจจุบันทำให้ยากต่อการกำหนดแหล่งที่มาของค่าอาร์กิวเมนต์ ทำให้การพัฒนาระบบกำหนดค่าที่แข็งแกร่งซับซ้อนขึ้น แม้ว่าจะมีวิธีแก้ไขชั่วคราว แต่มักต้องใช้ความซับซ้อนเพิ่มเติมและตรรกะที่กำหนดเองซึ่งนักพัฒนารู้สึกว่าควรจะถูกจัดการโดยไลบรารีโดยธรรมชาติ

ลำดับความสำคัญของการกำหนดค่า:

  1. ค่าเริ่มต้นของโปรแกรม (ความสำคัญต่ำสุด)
  2. ไฟล์การกำหนดค่า
  3. อาร์กิวเมนต์บรรทัดคำสั่ง
  4. การเปลี่ยนแปลงการกำหนดค่าขณะทำงาน (ความสำคัญสูงสุด)

โซลูชันทางเลือกและวิธีแก้ไขชั่วคราว

แม้จะมีข้อจำกัด แต่นักพัฒนาบางคนได้พบโซลูชันที่สร้างสรรค์ มีรายงานว่า Google Cloud CLI จัดการสถานการณ์ที่คล้ายกันโดยใช้กลุ่มอาร์กิวเมนต์ที่ซ้อนกัน แม้ว่าวิธีการนี้อาจอาศัยฟีเจอร์ที่ไม่มีเอกสารซึ่งอาจถูกเอาออกในเวอร์ชันอนาคต

gcloud CLI จัดการสิ่งนี้โดยใช้ argparse มีกลุ่ม mutex หลักที่มีแฟล็ก —no-timeout ลูกหนึ่งตัว และจากนั้นมีกลุ่มลูกที่ประกอบด้วยแฟล็ก timeout

คำแนะนำอื่น ๆ รวมถึงการใช้ไลบรารีทางเลือกเช่น Click ซึ่งอาจให้ความยืดหยุ่นมากขึ้นสำหรับสถานการณ์การแยกวิเคราะห์อาร์กิวเมนต์ที่ซับซ้อน อย่างไรก็ตาม การเปลี่ยนไลบรารีไม่ใช่เรื่องที่ปฏิบัติได้เสมอไปสำหรับโปรเจ็กต์ที่มีอยู่หรือทีมที่ใช้มาตรฐาน argparse

บทสรุป

การอภิปรายนี้เน้นย้ำถึงความตึงเครียดที่กว้างขึ้นในการออกแบบซอฟต์แวร์ระหว่างความเรียบง่ายและความยืดหยุ่น ในขณะที่ argparse ให้บริการกรณีการใช้งานพื้นฐานส่วนใหญ่ได้ดี นักพัฒนาที่ทำงานกับอินเทอร์เฟซ command-line ที่ซับซ้อนมากขึ้นพบว่าตัวเองต้องต่อสู้กับข้อจำกัดของไลบรารีมากกว่าที่จะได้รับการเสริมพลังจากฟีเจอร์ของมัน ในขณะที่ Python ยังคงพัฒนาต่อไป การอภิปรายเหล่านี้อาจมีอิทธิพลต่อการปรับปรุงความสามารถในการแยกวิเคราะห์อาร์กิวเมนต์ในอนาคตหรือผลักดันให้มีการใช้งานโซลูชันทางเลือก

อ้างอิง: You're using a suspiciously old browser