Mengapa menggunakan argparse daripada optparse?

290

Saya perhatikan bahwa dokumentasi Python 2.7 termasuk modul parsing command-line. Selain getoptdan optparsesekarang kita miliki argparse.

Mengapa modul parsing baris perintah lainnya telah dibuat? Mengapa saya harus menggunakannya optparse? Apakah ada fitur baru yang harus saya ketahui?

fmark
sumber
8
Atau mungkin tidak menggunakan apa pun karena sejak 2012 Python memiliki modul yang mudah, kuat dan sangat keren untuk parsing argumen yang disebut docopt. docopt.org
ndemou
1
coba klik itu pembungkus optparse.
Amit Tripathi

Jawaban:

324

Pada python 2.7, optparsesudah usang, dan mudah-mudahan akan hilang di masa depan.

argparselebih baik karena semua alasan yang tercantum di halaman aslinya ( https://code.google.com/archive/p/argparse/ ):

  • menangani argumen posisi
  • mendukung sub-perintah
  • memungkinkan awalan opsi alternatif seperti +dan/
  • menangani argumen gaya nol atau lebih dan satu atau lebih
  • menghasilkan pesan penggunaan yang lebih informatif
  • menyediakan antarmuka yang lebih sederhana untuk jenis dan tindakan khusus

Informasi lebih lanjut juga ada dalam PEP 389 , yang merupakan kendaraan yang argparsemembuatnya menjadi perpustakaan standar.

Nicholas Knight
sumber
18
Antarmuka yang jauh lebih sederhana untuk jenis khusus ... tetapi antarmuka yang lebih kompleks secara keseluruhan. Saya benar-benar bertanya-tanya mengapa saya bahkan beralih ke optparse, karena drumroll getopt akan tetap ada . Yup, tidak ada penghinaan bagi dinosaurus itu. Sheeesh.
Jürgen A. Erhard
4
Penyebutan "kemurnian" optparsedalam PEP kemudian argumen tentang betapa rumitnya menambahkan untuk membuatnya terdengar seperti itu dikodekan menjadi sefleksibel batu (buruk).
Nick T
1
Antarmuka sub-perintah buruk. Output default tidak berguna dan mengubahnya sulit.
anatoly techtonik
Perhatikan bahwa code.google.com akan melanjutkan Pemeliharaan dalam beberapa hari. Perbedaan dengan perincian lebih lanjut tersedia di sini: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.
63

Mengapa saya harus menggunakannya daripada optparse? Apakah fitur baru mereka harus saya ketahui?

@ Nicholas menjawab dengan baik, saya pikir, tetapi bukan pertanyaan "meta" yang Anda mulai dengan:

Mengapa modul parsing baris perintah lainnya telah dibuat?

Itulah dilema nomor satu ketika modul apa pun yang berguna ditambahkan ke pustaka standar: apa yang Anda lakukan ketika cara yang jauh lebih baik, tetapi tidak kompatibel ke belakang, untuk menyediakan jenis fungsionalitas yang sama muncul?

Entah Anda tetap dengan cara lama dan diakui melampaui (biasanya ketika kita berbicara tentang paket rumit: asyncore vs twisted, tkinter vs wx atau Qt, ...) atau Anda berakhir dengan beberapa cara yang tidak kompatibel untuk melakukan hal yang sama (XML parser, IMHO, adalah contoh yang lebih baik dari ini daripada parser baris perintah - tetapi emailpaket vs berbagai cara lama untuk menangani masalah serupa juga tidak terlalu jauh ;-).

Anda dapat membuat omelan mengancam dalam dokumen tentang cara-cara lama menjadi "usang", tetapi (selama Anda perlu menjaga kompatibilitas ke belakang) Anda tidak dapat benar-benar menghilangkannya tanpa menghentikan aplikasi besar dan penting dari pemindahan ke rilis Python yang lebih baru.

(Dilema nomor dua, tidak terkait langsung dengan pertanyaan Anda, dirangkum dalam pepatah lama, "perpustakaan standar adalah tempat paket yang baik untuk mati" ... dengan rilis setiap setengah tahun atau lebih, paket yang tidak terlalu, sangat stabil, tidak memerlukan rilis lebih sering dari itu, sebenarnya bisa sangat menderita dengan menjadi "beku" di perpustakaan standar ... tapi, itu benar-benar masalah yang berbeda).

Alex Martelli
sumber
Memang, Anda dapat menyertakan argparse.py untuk instalasi python sebelum 2.7 dan tidak khawatir tentang perubahan yang tidak kompatibel dengan mundur. Hal ekstra untuk dilacak, tetapi masih dipertahankan di luar perpustakaan standar di argparse.googlecode.com
Ehtesh Choudhury
2
Argparse jauh lebih baik hanya untuk beberapa kegunaan (niche?). Ini tidak benar-benar lebih baik secara absolut, itu berbeda . Ia dapat melakukan hal-hal yang tidak dapat dilakukan optparse, tetapi juga memiliki regresi. Salah satu contoh saya baru saja bertemu: optparse menangani "-" secara default (tidak yakin itu melakukan apa yang seharusnya dilakukan) sementara argparse tidak tahu apa-apa tentang itu.
Jürgen A. Erhard
Bagi siapa pun yang datang ke komentar di atas terlambat, argparse meminta Anda mengatur awalan dan namanya, dan sebagian besar parser ditulis sebagai parser.add_argument('--long-opt', '-l',...); '-' ditangani dengan mudah, dan bagaimanapun Anda suka.
SilverbackNet
18

Ada juga anak-anak baru di blok!

  • Selain optparse usang yang telah disebutkan . [JANGAN GUNAKAN]
  • argparse juga disebutkan, yang merupakan solusi bagi orang-orang yang tidak mau memasukkan lib eksternal.
  • docopt adalah lib eksternal yang layak untuk dilihat, yang menggunakan string dokumentasi sebagai parser untuk input Anda.
  • klik juga lib eksternal dan menggunakan dekorator untuk mendefinisikan argumen. (Sumber saya merekomendasikan: Mengapa Klik )
  • python-inquirer Untuk alat fokus pilihan dan berdasarkan Inquirer.js ( repo )

Jika Anda membutuhkan perbandingan yang lebih mendalam, silakan baca ini dan Anda dapat menggunakan docopt atau klik . Terima kasih kepada Kyle Purdon!

lony
sumber
4
sementara ini adalah komentar yang berharga, itu masih merupakan komentar lebih dari sebuah jawaban .. tidak ada downvote tapi tidak ada upvote bagi saya juga! Perluas jawaban Anda dengan ringkasan artikel yang berharga untuk menjadikannya jawaban nyata !: meta.stackexchange.com/a/8259/172394
Stefano
1
Saya mencoba memasukkan ringkasan tautan saya, saya harap sekarang ini layak untuk jawaban stackoverflow yang baik.
lony
6

Pada awalnya saya enggan sebagai @fmark untuk beralih dari optparse ke argparse, karena:

  1. Saya pikir perbedaannya tidak begitu besar.
  2. Cukup beberapa VPS masih menyediakan Python 2.6 secara default.

Lalu saya melihat dokumen ini, argparse mengungguli optparse, terutama ketika berbicara tentang menghasilkan pesan bantuan yang bermakna: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Dan kemudian saya melihat " argparse vs optparse " oleh @Nicholas, mengatakan kita bisa memiliki argparse tersedia dalam python <2.7 (Yap, saya tidak tahu itu sebelumnya.)

Sekarang kedua masalah saya telah diatasi dengan baik. Saya menulis harapan ini akan membantu orang lain dengan pola pikir yang sama.

RayLuo
sumber