Neden optparse yerine argparse kullanılır?


290

Python 2.7 belgelerinin başka bir komut satırı ayrıştırma modülü içerdiğini fark ettim. Ayrıca getoptve optparseşimdi var argparse.

Neden başka bir komut satırı ayrıştırma modülü oluşturuldu? Neden yerine kullanmalıyım optparse? Bilmem gereken yeni özellikler var mı?


8
Ya da belki hiçbirini kullanmayın çünkü 2012'den beri Python, docopt adı verilen bağımsız değişken ayrıştırma için kolay, güçlü ve gerçekten harika bir modüle sahiptir. Docopt.org
ndemou

1
optparse etrafında sarıcı olduğunu tıklayın deneyin.
Amit Tripathi

Yanıtlar:


324

Python'dan itibaren 2.7, optparsekullanımdan kaldırıldı ve umarım gelecekte gidecek.

argparseorijinal sayfasında listelenen tüm nedenlerden dolayı daha iyidir ( https://code.google.com/archive/p/argparse/ ):

  • konumsal argümanları ele almak
  • alt komutları destekleme
  • +ve gibi alternatif seçenek öneklerine izin verme/
  • sıfır veya daha fazla ve bir veya daha fazla stil bağımsız değişkenini işleme
  • daha bilgilendirici kullanım mesajları üretmek
  • özel türler ve eylemler için çok daha basit bir arayüz sağlar

Daha fazla bilgi, standart kütüphaneye dönüştürülen araç olan PEP 389'da da bulunmaktadır argparse.


18
Özel türler için çok daha basit bir arayüz ... ancak genel olarak daha karmaşık bir arayüz. Gerçekten çünkü ben bile, optparse geçiş neden merak yapmak Drumroll getopt olacaktır kalmak . Evet, o dinozor için yoksunluk yok. Sheeesh.
Jürgen A. Erhard

4
PEP'teki "saflık" optparseifadesinden sonra, daha sonra kaya kadar esnek (kötü) olarak kodlanmış gibi görünmesini sağlamak için ne kadar karmaşık olacağına dair argümanlar.
Nick T

1
Alt komutlar arabirimi zayıf. Varsayılan çıktı yararlı değildir ve değiştirilmesi zordur.
anatoly techtonik

Code.google.com'un birkaç gün içinde Bakım'a devam edeceğini unutmayın. Daha fazla ayrıntı içeren farklılıkları burada bulabilirsiniz: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.

63

Neden optparse yerine kullanmalıyım? Onların bilmem gereken yeni özellikleri var mı?

@ Nicholas'ın cevabı bu kadar iyi, sanırım, ama başladığınız daha fazla "meta" soruyu değil:

Neden başka bir komut satırı ayrıştırma modülü oluşturuldu?

Bu, standart kitaplığa herhangi bir yararlı modül eklendiğinde bir numaralı ikilemdir: Aynı tür işlevsellik sağlamanın önemli ölçüde daha iyi, ancak geriye dönük olarak uyumsuz bir yolu ortaya çıktığında ne yaparsınız?

Ya eski ve kuşkusuz aşılmış bir şekilde (tipik olarak karmaşık paketlerden söz ettiğimizde) sadık kalırsınız: asyncore vs twisted, tkinter vs wx veya Qt, ...) veya aynı şeyi yapmak için birden fazla uyumsuz yolla sonuçlanırsınız (XML ayrıştırıcılar, IMHO, bunun komut satırı ayrıştırıcılarından daha iyi bir örneğidir - ancak emailbenzer sorunlarla başa çıkmak için sayısız eski yollara karşı paket çok uzak değildir ;-).

Dokümanlarda eski "kullanımdan kaldırılma" konusunda tehdit edici hile yapabilirsiniz, ancak (geriye dönük uyumluluğu korumanız gerektiği sürece) büyük, önemli uygulamaların daha yeni Python sürümlerine geçmesini engellemeden onları gerçekten kaldıramazsınız.

(Sorunuzla doğrudan ilgili olmayan ikilem ikilisi, eski standartta "standart kütüphane iyi paketlerin öldüğü yer" derken özetlenmektedir ... her yıl bir buçuk ya da daha fazla, çok fazla olmayan paketler, çok kararlı, değil bir daha sık daha bültenleri gerek aslında) gerçekten farklı bir mesele olduğunu, standart kütüphanesinde "donmuş" kalarak büyük ölçüde zarar ... ancak.


Kuşkusuz, 2.7'den önce python kurulumları için argparse.py ekleyebilir ve geriye dönük uyumsuz değişiklikler konusunda endişelenmeyebilirsiniz. İzlemek için ekstra bir şey, ancak argparse.googlecode.com adresindeki standart kitaplığın dışında hala korunuyor
Ehtesh Choudhury 15:13

2
Argparse sadece bazı (niş?) Kullanımlar için önemli ölçüde daha iyidir. Mutlak anlamda gerçekten daha iyi değil, farklı . Optparse'ın yapamayacağı şeyleri yapabilir, ancak regresyonları da vardır. Ben sadece bir örnek koştu: optparse ele "-" varsayılan (bunun ne gerekiyordu emin değilim) iken argparse hiçbir şey bilmiyor.
Jürgen A. Erhard

Yukarıdaki yoruma geç gelen herkes için, argparse öneki ve ismi ayarladınız ve çoğu çözümleyici parser.add_argument('--long-opt', '-l',...); '-' kolayca halledilir ve istediğiniz gibi.
SilverbackNet


18

Ayrıca blokta yeni çocuklar var!

  • Ayrıca daha önce belirtilen kullanımdan kaldırılmış optparse . [KULLANMAYIN]
  • argparse dahil etmek istemeyen insanlar için bir çözüm olan de bahsedildi.
  • docopt , girişiniz için ayrıştırıcı olarak bir belge dizesi kullanan, bakmaya değer harici bir lib'dir .
  • click ayrıca harici bir lib'dir ve bağımsız değişkenleri tanımlamak için dekoratörler kullanır. (Kaynağım önerir: Neden Tıklama )
  • python-inquirer Seçim odaklı araçlar için ve Inquirer.js ( repo ) tabanlı

Eğer daha derinlemesine bir karşılaştırma gerekirse okuyunuz bu ve kullanmakta sona erebilir docopt veya tıklayın . Kyle Purdon'a teşekkürler!


4
Bu değerli bir yorum olsa da, hala bir cevap daha bir yorum .. hiçbir downvote ama benim için hiçbir upvote! Gerçek bir cevap haline getirmek için cevabınızı makalenin değerli bir özetiyle genişletin !: meta.stackexchange.com/a/8259/172394
Stefano

1
Bağlantımın bir özetini eklemeye çalıştım, umarım şimdi iyi bir stackoverflow cevabına değer.
Lony

6

İlk başta optparse'den argparse'a geçmek için @ fmark kadar isteksizdim, çünkü:

  1. Aradaki farkın o kadar da büyük olmadığını düşündüm.
  2. Oldukça bazı VPS hala varsayılan olarak Python 2.6 sağlar.

Sonra bu dokümanı gördüm, argparse, özellikle anlamlı yardım mesajı oluşturma hakkında konuşurken, optparse'den daha iyi performans gösteriyor: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Sonra @Nicholas'ın " argparse vs. optparse " ifadesini gördüm , python <2.7'de argparse olabileceğimizi söyledim (Evet, bunu daha önce bilmiyordum.)

Şimdi iki endişem iyi bir şekilde ele alındı. Bunu, benzer bir zihniyete sahip başkalarına yardımcı olacağını umarak yazdım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.