Tại sao sử dụng argparse chứ không phải optparse?


290

Tôi nhận thấy rằng tài liệu Python 2.7 bao gồm một mô-đun phân tích dòng lệnh khác. Ngoài getoptoptparsebây giờ chúng tôi có argparse.

Tại sao có một mô-đun phân tích dòng lệnh khác được tạo ra? Tại sao tôi nên sử dụng nó thay vì optparse? Có những tính năng mới mà tôi nên biết về?


8
Hoặc có thể không sử dụng vì từ năm 2012 Python có một mô-đun dễ dàng, mạnh mẽ và thực sự tuyệt vời để phân tích cú pháp đối số được gọi là docopt. docopt.org
ndemou

1
thử nhấp vào nó là bao bọc xung quanh optparse.
Amit Tripathi

Câu trả lời:


324

Vì trăn 2.7, optparsebị phản đối, và hy vọng sẽ biến mất trong tương lai.

argparsetốt hơn cho tất cả các lý do được liệt kê trên trang gốc của nó ( https://code.google.com.vn/archive/p/argparse/ ):

  • xử lý các đối số vị trí
  • hỗ trợ các lệnh phụ
  • cho phép các tiền tố tùy chọn thay thế như +/
  • xử lý các đối số kiểu 0 hoặc nhiều hơn và một hoặc nhiều kiểu
  • tạo ra nhiều thông điệp sử dụng thông tin hơn
  • cung cấp giao diện đơn giản hơn nhiều cho các loại và hành động tùy chỉnh

Thông tin thêm cũng có trong PEP 389 , đây là phương tiện argparseđưa nó vào thư viện tiêu chuẩn.


18
Một giao diện đơn giản hơn nhiều cho các loại tùy chỉnh ... nhưng tổng thể giao diện phức tạp hơn. Tôi thực sự tự hỏi tại sao tôi thậm chí đã chuyển sang optparse, bởi vì getopt trống sẽ ở lại . Yup, không có sự phản đối cho con khủng long đó. Sheeesh.
Jürgen A. Erhard

4
Việc đề cập đến "độ tinh khiết" của optparsePEP sau đó tranh luận về mức độ phức tạp của nó để thêm vào để làm cho âm thanh giống như được mã hóa là linh hoạt như đá (kém).
Nick T

1
Giao diện tiểu ban kém. Đầu ra mặc định là không hữu ích và thay đổi nó là khó khăn.
anatoly techtonik 6/03/2015

Lưu ý rằng code.google.com sẽ được Bảo trì sau vài ngày. Sự khác biệt với nhiều chi tiết có sẵn ở đây: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.

63

Tại sao tôi nên sử dụng nó thay vì optparse? Là những tính năng mới của họ tôi nên biết về?

Câu trả lời của @ Nicholas bao gồm điều này tốt, tôi nghĩ, nhưng không phải là câu hỏi "meta" hơn mà bạn bắt đầu với:

Tại sao có một mô-đun phân tích dòng lệnh khác được tạo ra?

Đó là vấn đề nan giải số một khi bất kỳ mô-đun hữu ích nào được thêm vào thư viện tiêu chuẩn: bạn sẽ làm gì khi một cách tốt hơn, nhưng không tương thích ngược, để cung cấp cùng loại chức năng xuất hiện?

Hoặc bạn gắn bó với cách cũ và được thừa nhận (thường là khi chúng ta đang nói về các gói phức tạp: asyncore vs twist, tkinter vs wx hoặc Qt, ...) hoặc bạn kết thúc với nhiều cách không tương thích để làm điều tương tự (XML Trình phân tích cú pháp, IMHO, là một ví dụ thậm chí còn tốt hơn so với trình phân tích cú pháp dòng lệnh - nhưng emailgói so với vô số cách cũ để xử lý các vấn đề tương tự cũng không quá xa ;-).

Bạn có thể khiến những lời cằn nhằn đe dọa trong các tài liệu về những cách cũ bị "phản đối", nhưng (miễn là bạn cần giữ khả năng tương thích ngược), bạn không thể thực sự loại bỏ chúng mà không ngăn các ứng dụng lớn, quan trọng chuyển sang các bản phát hành Python mới hơn.

(Vấn đề nan giải số hai, không liên quan trực tiếp đến câu hỏi của bạn, được tóm tắt trong câu nói cũ "thư viện tiêu chuẩn là nơi các gói tốt sẽ chết" ... với các bản phát hành mỗi năm rưỡi hoặc lâu hơn, các gói không phải là rất, rất ổn định, không cần phát hành thường xuyên hơn thế, thực sự có thể bị ảnh hưởng đáng kể do bị "đóng băng" trong thư viện tiêu chuẩn ... nhưng, đó thực sự là một vấn đề khác).


Phải thừa nhận rằng, bạn có thể bao gồm argparse.py để cài đặt python trước 2.7 và không phải lo lắng về những thay đổi không tương thích ngược. Thêm điều để theo dõi, nhưng nó vẫn được duy trì bên ngoài thư viện tiêu chuẩn tại argparse.googlecode.com
Ehtesh Choudhury

2
Argparse về cơ bản chỉ tốt hơn cho một số sử dụng (thích hợp?). Nó không thực sự tốt hơn về mặt tuyệt đối, nó khác . Nó có thể làm những thứ optparse không thể, nhưng nó cũng có hồi quy. Một ví dụ tôi vừa chạy vào: optparse xử lý "-" theo mặc định (không chắc nó đã làm những gì đáng lẽ phải làm) trong khi argparse không biết gì về nó.
Jürgen A. Erhard

Đối với bất kỳ ai đến nhận xét trên muộn, argparse bạn đã đặt tiền tố và tên và hầu hết các trình phân tích cú pháp được viết là parser.add_argument('--long-opt', '-l',...); '-' được xử lý dễ dàng và tuy nhiên bạn thích.
SilverbackNet


18

Ngoài ra còn có những đứa trẻ mới vào khối!

  • Bên cạnh optparse đã được đề cập . [KHÔNG ĐƯỢC DÙNG]
  • argparse cũng đã được đề cập, đó là một giải pháp cho những người không sẵn sàng bao gồm các lib bên ngoài.
  • docopt là một lib đáng xem bên ngoài, sử dụng chuỗi tài liệu làm trình phân tích cú pháp cho đầu vào của bạn.
  • nhấp cũng là lib bên ngoài và sử dụng trang trí để xác định đối số. (Nguồn của tôi khuyến nghị: Tại sao lại nhấp )
  • python-inquirer Để lựa chọn các công cụ tập trung và dựa trên Inquirer.js ( repo )

Nếu bạn cần so sánh sâu hơn, vui lòng đọc phần này và cuối cùng bạn có thể sử dụng docopt hoặc nhấp chuột . Cảm ơn Kyle Purdon!


4
trong khi đây là một bình luận đáng giá, nó vẫn là một bình luận nhiều hơn một câu trả lời .. không downvote nhưng cũng không upvote cho tôi! Mở rộng câu trả lời của bạn với một bản tóm tắt có giá trị của bài viết để biến nó thành một câu trả lời thực sự !: meta.stackexchange.com/a/8259/172394
Stefano

1
Tôi đã cố gắng để bao gồm một bản tóm tắt của liên kết của tôi, tôi hy vọng bây giờ nó là giá trị một câu trả lời stackoverflow tốt.
lony

6

Lúc đầu, tôi miễn cưỡng như @fmark để chuyển từ optparse sang argparse, bởi vì:

  1. Tôi nghĩ rằng sự khác biệt không phải là quá lớn.
  2. Khá nhiều VPS vẫn cung cấp Python 2.6 theo mặc định.

Sau đó, tôi đã thấy tài liệu này, argparse vượt trội hơn optparse, đặc biệt là khi nói về việc tạo thông điệp trợ giúp có ý nghĩa: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Và sau đó tôi thấy " argparse vs. optparse " của @Nicholas, nói rằng chúng ta có thể có argparse có sẵn trong python <2.7 (Yep, tôi không biết điều đó trước đây.)

Bây giờ hai mối quan tâm của tôi được giải quyết tốt. Tôi đã viết điều này với hy vọng nó sẽ giúp những người khác có cùng suy nghĩ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.