2010-07-10 44 views
237

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 getoptoptparse, chúng tôi hiện có argparse.Tại sao sử dụng argparse chứ không phải là optparse?

Tại sao lại có một mô-đun phân tích dòng lệnh khác được tạo? 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 không?

+7

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

+1

hãy thử nhấp vào nó là trình bao bọc xung quanh optparse. –

Trả lời

257

Tính đến python 2.7, optparse bị phản đối, và hy vọng sẽ biến mất trong tương lai.

argparse là tốt hơn cho tất cả những lý do được liệt kê trên trang của nó ban đầu (https://code.google.com/archive/p/argparse/):

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

biết thêm thông tin cũng là trong PEP 389, đó là chiếc xe mà argparse đã làm cho nó vào thư viện chuẩn.

+14

Giao diện đơn giản hơn nhiều đối với các loại tùy chỉnh ... nhưng tổng thể là 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ì * drumroll * getopt sẽ * ở lại *. Yup, không có sự phản đối cho con khủng long đó. Sheeesh. –

+3

Việc đề cập đến "độ tinh khiết" của 'optparse' trong PEP sau đó lập luận về mức độ phức tạp của nó để làm cho nó có vẻ như nó được mã hóa thành mềm dẻo như đá (kém). –

+1

Giao diện subcommands kém. Mặc định đầu ra là không hữu ích và thay đổi nó là khó khăn. –

58

Tại sao tôi nên sử dụng nó thay vì không hợp lệ? Các tính năng mới của tôi có phải là không?

@ câu trả lời Nicholas của diện này tốt, tôi nghĩ, nhưng không phải là "meta" câu hỏi nữa bạn bắt đầu với:

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

Đó là số tiến thoái lưỡng nan khi bất kỳ mô-đun hữu ích nào được thêm vào thư viện chuẩn: bạn làm gì khi tốt hơn, nhưng không tương thích ngược, cách cung cấp cùng một 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 nói về các gói phức tạp: asyncore vs twisted, tkinter vs wx hoặc Qt, ...) hoặc bạn kết thúc bằng nhiều cách không tương thích để thực hiện cùng một điều (XML parsers, IMHO, là một ví dụ tốt hơn về điều này hơn là các trình phân tích cú pháp dòng lệnh - nhưng gói email và vô số cách cũ để đối phó với các vấn đề tương tự cũng không quá xa ;-).

Bạn có thể đe dọa đến các tài liệu về các cách cũ "không được chấp nhận", nhưng (miễn là bạn cần giữ tính tương thích ngược), bạn không thể lấy chúng đi mà không dừng các ứng dụng quan trọng, lớn. bản phát hành Python mới hơn.

(Số tiến thoái lưỡng nan thứ 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 chuẩn là nơi gói tốt đi chết" ... với bản phát hành hàng năm và một nửa hoặc hơn, gói có aren Không, rất ổn định, không phải là cần phát hành thường xuyên hơn, thực sự có thể bị ảnh hưởng đáng kể do "bị đóng băng" trong thư viện chuẩn ... nhưng, đó thực sự là một vấn đề khác).

+0

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ề việc ngược lại thay đổi không tương thích. Điều bổ sung để theo dõi, nhưng nó vẫn được duy trì bên ngoài thư viện chuẩn tại argparse.googlecode.com –

+2

Argparse là tốt hơn đáng kể chỉ cho một số (thích hợp?) Sử dụng. 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ứ không thể phân biệt được, nhưng nó cũng có những hồi quy. Một ví dụ tôi chỉ chạy vào: optparse xử lý "-" theo mặc định (không chắc chắn nó đã làm những gì điều này là nghĩa vụ phải làm) trong khi argparse không biết bất cứ điều gì của nó. –

3

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

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

Sau đó, tôi nhìn thấy doc này, argparse nhanh hơn so với optparse, đặc biệt là khi nói về việc tạo ra ý nghĩa thông báo trợ giúp: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Và sau đó tôi thấy "argparse vs. optparse" bởi @Nicholas, nói rằng chúng tôi có thể có sẵn trong argparse python < 2.7 (Đúng, 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 hy vọng nó sẽ giúp những người khác với một tư duy tương tự.

1

Cá nhân tôi thích optparse hơn argparse vì

  1. argparse là nó có một số hành vi có vấn đề mà làm cho xử lý tùy ý giao diện dòng lệnh.

  2. argparse có hành vi ma thuật tích hợp để đoán xem có điều gì đó là đối số hoặc tùy chọn hay không. Điều này sẽ trở thành một vấn đề khi giao dịch với các dòng lệnh không đầy đủ vì không thể biết mà không có sự hiểu biết đầy đủ về dòng lệnh mà trình phân tích cú pháp sẽ xử lý như thế nào.

  3. argparse hiện không hỗ trợ vô hiệu hóa đối số xen kẽ.

Cả hai đều hoạt động tốt cho các ứng dụng dòng lệnh cơ bản.

+1

"argparse là nó có một số hành vi có vấn đề mà làm cho việc xử lý các giao diện dòng lệnh tùy ý." - Tôi không hiểu anh đang nói gì ở đây. Có vẻ như câu bị thiếu một khởi đầu và kết thúc. – Toastgeraet

+2

Vì đây là bản sao và dán không thành công từ [So sánh của nhấp chuột] (http://click.pocoo.org/5/why/#why-not-argparse). – leesei

11

Ngoài ra còn có trẻ em mới trên khối!

  • Bên cạnh việc không được đề cập optparse. [KHÔNG SỬ DỤNG]
  • argparse cũng được đề cập, đây là giải pháp cho những người không sẵn sàng đưa vào libs bên ngoài.
  • docopt là giá trị lib bên ngoài đang xem xét, 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 vào cũng là lib bên ngoài và sử dụng trình trang trí để xác định đối số.(Nguồn của tôi đề nghị: Why Click)

Nếu bạn cần một nhiều hơn so sâu xin vui lòng đọc this và bạn có thể sẽ sử dụng docopt hoặc nhấp chuột. Cảm ơn Kyle Purdon!

+0

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 không upvote cho tôi cũng vậy! 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 để làm cho nó thành một câu trả lời thực sự !: https://meta.stackexchange.com/a/8259/172394 – Stefano

+0

Tôi đã cố gắng bao gồm một bản tóm tắt liên kết của tôi. một câu trả lời stackoverflow tốt. – lony

Các vấn đề liên quan