เหตุใดจึงต้องใช้ argparse แทนที่จะใช้ optparse


290

ฉันสังเกตเห็นว่าเอกสาร Python 2.7 มีโมดูลการแยกวิเคราะห์บรรทัดคำสั่งอื่น นอกเหนือไปgetoptและตอนนี้เรามีoptparseargparse

เหตุใดจึงไม่มีโมดูลการแยกวิเคราะห์บรรทัดคำสั่งอื่นถูกสร้างขึ้น ทำไมฉันจึงควรใช้แทนoptparse? มีคุณสมบัติใหม่ที่ฉันควรรู้หรือไม่?


8
หรืออาจจะไม่ใช้เพราะตั้งแต่ปี 2012 Python มีโมดูลที่ง่ายมีประสิทธิภาพและเจ๋งจริงสำหรับการแยกอาร์กิวเมนต์ที่เรียกว่า docopt docopt.org
ndemou

1
ลองคลิกมันเป็น wrapper รอบ optparse
Amit Tripathi

คำตอบ:


324

ในฐานะของงูหลาม2.7, optparseเลิกและหวังว่าจะหายไปในอนาคต

argparseดีกว่าด้วยเหตุผลทั้งหมดที่ระบุไว้ในหน้าเดิม ( https://code.google.com/archive/p/argparse/ ):

  • การจัดการข้อโต้แย้งตำแหน่ง
  • สนับสนุนคำสั่งย่อย
  • ช่วยให้คำนำหน้าตัวเลือกอื่นเช่น+และ/
  • การจัดการข้อโต้แย้งสไตล์ศูนย์หรือมากกว่าและหนึ่งหรือมากกว่า
  • สร้างข้อความการใช้งานที่ให้ข้อมูลเพิ่มเติม
  • นำเสนออินเทอร์เฟซที่ง่ายกว่าสำหรับประเภทและการกระทำที่กำหนดเอง

ข้อมูลเพิ่มเติมยังอยู่ในPEP 389ซึ่งเป็นยานพาหนะที่argparseทำให้มันกลายเป็นห้องสมุดมาตรฐาน


18
อินเทอร์เฟซที่เรียบง่ายกว่ามากสำหรับประเภทที่กำหนดเอง ... แต่อินเทอร์เฟซที่ซับซ้อนกว่าโดยรวม ผมสงสัยว่าทำไมทำฉันก็เปลี่ยนไป optparse เพราะรัวกลอง getopt จะอยู่ ใช่ไม่ลดราคาสำหรับไดโนเสาร์ตัวนั้น Sheeesh
Jürgen A. Erhard

4
การกล่าวถึง "ความบริสุทธิ์" optparseใน PEP จากนั้นมีการโต้แย้งในภายหลังเกี่ยวกับความซับซ้อนที่เพิ่มเข้ามาเพื่อให้ดูเหมือนว่ารหัสถูกยืดหยุ่นเหมือนหิน (ไม่ดี)
Nick T

1
อินเตอร์เฟสคำสั่งย่อยไม่ดี เอาต์พุตเริ่มต้นไม่มีประโยชน์และเปลี่ยนแปลงได้ยาก
Anatoly techtonik

โปรดทราบว่า code.google.com จะทำการบำรุงรักษาในไม่กี่วัน ความแตกต่างของรายละเอียดเพิ่มเติมมีให้ที่นี่: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.

63

ทำไมฉันถึงควรใช้มันแทน optparse คุณสมบัติใหม่ของพวกเขาที่ฉันควรรู้คืออะไร?

@ คำตอบของนิโคลัสครอบคลุมเรื่องนี้ฉันคิดว่า แต่ไม่ใช่คำถาม "เมตา" ที่คุณเริ่มต้นด้วย

เหตุใดจึงยังสร้างโมดูลการแยกวิเคราะห์บรรทัดคำสั่งอื่นอีก

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

ไม่ว่าคุณจะใช้วิธีเก่าและเกินกว่าจะยอมรับได้ (โดยทั่วไปเมื่อเรากำลังพูดถึงแพ็คเกจที่ซับซ้อน: asyncore vs twisted, tkinter vs wx หรือ Qt, ... ) หรือคุณจบด้วยวิธีที่เข้ากันไม่ได้หลายอย่างในการทำสิ่งเดียวกัน (XML parsers, IMHO เป็นตัวอย่างที่ดียิ่งขึ้นกว่าตัวแยกวิเคราะห์บรรทัดคำสั่ง - แต่emailแพ็คเกจเทียบกับวิธีเก่า ๆ มากมายที่จะจัดการกับปัญหาที่คล้ายกันไม่ไกลเกินไป ;-)

คุณอาจข่มขู่คำหยาบในเอกสารเกี่ยวกับวิธีการเดิม ๆ ที่ "เลิก" แต่ (ตราบใดที่คุณต้องรักษาความเข้ากันได้ย้อนหลัง) คุณจะไม่สามารถนำพวกเขาออกไปได้จริง ๆ โดยไม่หยุดแอปพลิเคชันขนาดใหญ่

(กระอักกระอ่วนหมายเลขสองไม่เกี่ยวข้องโดยตรงกับคำถามของคุณโดยสรุปในคำพูดเก่า ๆ ว่า "ห้องสมุดมาตรฐานคือที่ ๆ แพ็คเกจดีๆกำลังจะตาย" ... ด้วยการเปิดตัวทุกปีครึ่งหรือมากกว่านั้นแพ็คเกจที่ไม่มากมีเสถียรภาพมากไม่จำเป็นต้องเผยแพร่บ่อยกว่านั้นสามารถประสบปัญหาอย่างมากโดยการ "แช่แข็ง" ในไลบรารีมาตรฐาน ... แต่นั่นเป็นปัญหาที่แตกต่างกันจริงๆ)


เป็นที่ยอมรับคุณสามารถรวม argparse.py สำหรับการติดตั้งหลามก่อน 2.7 และไม่ต้องกังวลเกี่ยวกับการเปลี่ยนแปลงที่เข้ากันไม่ได้ย้อนหลัง สิ่งพิเศษที่ต้องติดตาม แต่มันยังคงอยู่นอกห้องสมุดมาตรฐานที่ argparse.googlecode.com
Ehtesh Choudhury

2
การโต้เถียงจะดีขึ้นอย่างมากสำหรับการใช้งาน (ซอก?) เท่านั้น มันไม่ได้จริงๆที่ดีขึ้นในแง่แน่นอนมันแตกต่างกัน มันสามารถทำสิ่งที่ optparse ไม่สามารถทำได้ แต่มันก็มีการถดถอย ตัวอย่างหนึ่งที่ฉันเพิ่งพบ: optparse จัดการ "-" โดยค่าเริ่มต้น (ไม่แน่ใจว่ามันทำในสิ่งที่ควรทำ) ในขณะที่ argparse ไม่ทราบอะไรเลย
Jürgen A. Erhard

สำหรับทุกคนที่มาถึงความคิดเห็นข้างต้นช้าคุณได้กำหนดคำนำหน้าและชื่อและตัวแยกวิเคราะห์ส่วนใหญ่เขียนเป็นparser.add_argument('--long-opt', '-l',...); '-' จัดการได้อย่างง่ายดายและตามที่คุณต้องการ
SilverbackNet

37

แหล่งที่ดีที่สุดสำหรับเหตุผลสำหรับการเพิ่ม Python จะเป็น PEP: PEP 389: argparse - โมดูลการแยกวิเคราะห์บรรทัดคำสั่งใหม่โดยเฉพาะอย่างยิ่งในหัวข้อที่มีชื่อทำไมไม่ได้รับและ optparse เพียงพอ?


18

นอกจากนี้ยังมีเด็กใหม่ในบล็อก!

  • นอกจากเลิกกล่าวแล้วoptparse [ไม่ได้ใช้]
  • argparseถูกกล่าวถึงด้วยเช่นกันซึ่งเป็นวิธีแก้ปัญหาสำหรับผู้ที่ไม่ต้องการรวม libs ภายนอก
  • docoptเป็น lib ภายนอกที่ควรอ่านซึ่งใช้สตริงเอกสารเป็นตัวแยกวิเคราะห์สำหรับอินพุตของคุณ
  • คลิกเป็น lib ภายนอกและใช้ตกแต่งเพื่อกำหนดข้อโต้แย้ง (ที่มาของฉันแนะนำ: ทำไมคลิก )
  • python-inquirerสำหรับเครื่องมือที่เน้นการเลือกและใช้ Inquirer.js ( repo )

หากคุณจำเป็นต้องมีการเปรียบเทียบในเชิงลึกเพิ่มเติมโปรดอ่านนี้และคุณอาจจะสิ้นสุดการใช้docoptหรือคลิก ขอบคุณ Kyle Purdon!


4
ในขณะที่นี่คือความคิดเห็นที่คุ้มค่าก็ยังคงเป็นความคิดเห็นมากกว่าคำตอบ .. ไม่มี downvote แต่ไม่มี upvote สำหรับฉันเช่นกัน! ขยายคำตอบของคุณด้วยบทสรุปที่มีค่าของบทความเพื่อให้เป็นคำตอบที่แท้จริง!: meta.stackexchange.com/a/8259/172394
Stefano

1
ฉันพยายามที่จะรวมบทสรุปของลิงก์ของฉันฉันหวังว่าตอนนี้มันคุ้มค่ากับคำตอบที่ดีสำหรับ
lony

6

ตอนแรกฉันลังเลที่ @fmark เพื่อเปลี่ยนจาก optparse เป็น argparse เพราะ:

  1. ฉันคิดว่าความแตกต่างนั้นไม่ใหญ่มาก
  2. ค่อนข้างบาง VPS ยังคงให้ Python 2.6 โดยค่าเริ่มต้น

จากนั้นฉันก็เห็นเอกสารนี้โต้แย้งว่ามีประสิทธิภาพสูงกว่า optparse โดยเฉพาะเมื่อพูดถึงการสร้างข้อความช่วยเหลือที่มีความหมาย: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

และจากนั้นฉันก็เห็น " argparse vs. optparse " โดย @Nicholas บอกว่าเราสามารถมีอาร์กิวเมนต์ใน python <2.7 (ใช่ฉันไม่เคยรู้มาก่อน)

ตอนนี้ข้อกังวลสองข้อของฉันได้รับการแก้ไขอย่างดี ฉันเขียนสิ่งนี้โดยหวังว่ามันจะช่วยผู้อื่นด้วยความคิดที่คล้ายกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.