なぜoptparseではなくargparseを使うのですか?


290

Python 2.7のドキュメントには、さらに別のコマンドライン解析モジュールが含まれていることに気付きました。に加えてgetoptoptparse今持っていargparseます。

なぜさらに別のコマンドライン解析モジュールが作成されたのですか?代わりにそれを使用する必要があるのはなぜoptparseですか?知っておくべき新機能はありますか?


8
または2012年以降、Pythonにはdocoptと呼ばれる引数解析のための簡単でパワフルで本当にクールなモジュールがあるので、おそらく何も使用しません。docopt.org
ndemou

1
optparseのラッパーをクリックしてみてください。
Amit Tripathi 2015

回答:


324

pythonの時点で2.7optparseは非推奨であり、将来的にはなくなる予定です。

argparse元のページ(https://code.google.com/archive/p/argparse/)にリストされているすべての理由により、より優れています

  • 位置引数の処理
  • サポートするサブコマンド
  • +およびのような代替オプションのプレフィックスを許可する/
  • 0個以上のスタイル引数を処理する
  • より有益な使用法メッセージを生成する
  • カスタムのタイプとアクションにはるかにシンプルなインターフェースを提供する

詳細については、PEP 389も参照してください。PEP389argparse、標準ライブラリにしたのです。


18
カスタムタイプのインターフェイスははるかに単純ですが、全体としてはより複雑なインターフェイスです。私は本当になぜoptparseに切り替えたのかと思います。drumrollgetopt残るからです。うん、その恐竜の非難はない。シーッシュ。
ユルゲンA.エアハルト

4
optparsePEP での「純度」の言及は、後で追加するのがいかに複雑であるかについての議論で、ロックと同じくらい柔軟に(不十分に)コード化されているように聞こえます。
Nick T

1
サブコマンドのインターフェースは貧弱です。デフォルトの出力は役に立たず、変更は困難です。
anatoly techtonik 2015年

code.google.comは数日でメンテナンスが開始されます。詳細については、こちらをご覧ください。argparse.googlecode.com
Jean-Francois T.

63

なぜoptparseの代わりにそれを使うべきなのですか?私が知っておくべき新機能はありますか?

@Nicholasの回答はこれをうまくカバーしていると思いますが、あなたが最初から始める「メタ」質問はそうではありません。

なぜさらに別のコマンドライン解析モジュールが作成されたのですか?

これは、便利なモジュールが標準ライブラリに追加されたときの最大のジレンマです。同じ種類の機能を提供するための大幅に優れているが、下位互換性のない方法が出現した場合はどうしますか?

古い、そして確かに卓越した方法に固執する(通常、複雑なパッケージについて話しているとき:asyncore対ツイスト、tkinter対wxまたはQtなど)または、同じことを実行するための複数の互換性のない方法になってしまう(XMLパーサーであるIMHOは、コマンドラインパーサーよりもさらに良い例ですが、 emailパッケージと同様の問題に対処するための無数の古い方法はそれほど遠くないわけではありません;-)。

古い方法が「非推奨」であることをドキュメントで脅迫するかもしれませんが、(下位互換性を維持する必要がある限り)大きくて重要なアプリケーションを新しいPythonリリースに移行することを止めずに、それらを取り除くことはできません。

(ジレンマ2は、あなたの質問に直接関係していませんが、「標準ライブラリは良いパッケージが死ぬところです」という古い言い回しに要約されています...毎年1年半ほどのリリースで、それほどではないパッケージ、非常に安定した、ではない)任意のより頻繁にそれより前のリリースを必要とし、実際には標準ライブラリに「凍結」であることによって、実質的に苦しむことができます...しかし、実際には別の問題だという。


確かに、2.7より前のpythonインストール用にargparse.pyを含めることができ、下位互換性のない変更について心配する必要はありません。追跡する余計なもの、それでもargparse.googlecode.comの標準ライブラリの外で維持されています
Ehtesh Choudhury

2
Argparseは、一部の(niche?)使用に対してのみ実質的に優れています。それはだ、絶対的に本当に良くないです違います。optparseができないことはできますが、リグレッションも持っています。私が遭遇した一例:optparseはデフォルトで "-"を処理しましたが(これが何をするかはわかりません)、argparseはそれを何も知りません。
ユルゲン・A.エアハルト

上記のコメントに遅れて来た人のために、argparseはプレフィックスと名前を設定し、ほとんどのパーサーはと書かれていparser.add_argument('--long-opt', '-l',...)ます。「-」は簡単に処理できますが、好きなように操作できます。
SilverbackNet


18

ブロックには新しい子供たちもいます!

  • すでに述べた非推奨のoptparseに加えて。[使ってはいけません]
  • argparseについても触れましたが、これは外部ライブラリを含めたくない人のためのソリューションです。
  • docoptは、注目に値する外部libであり、ドキュメント文字列を入力のパーサーとして使用します。
  • clickも外部libであり、引数を定義するためにデコレーターを使用します。(私の情報源は以下を推奨します:なぜClick
  • python-inquirer選択に重点を置いたツール用で、Inquirer.js(repo)に基づく

より詳細な比較が必要な場合は、こちらをお読みください。docoptを使用するか、をクリックしてください。カイル・パードンに感謝!


4
これは価値のあるコメントですが、それでも回答以上のコメントです。反対投票も賛成投票もありません。記事の貴重な要約で回答を拡張して、実際の回答にしてください!:meta.stackexchange.com/a/8259/172394
Stefano

1
私は自分のリンクの概要を含めようとしましたが、これは良いスタックオーバーフローの回答の価値があると思います。
lony

6

最初は、@ fmarkのようにoptparseからargparseに切り替えるのをためらっていました。

  1. その差はそれほど大きくないと思いました。
  2. かなりのVPSがデフォルトでPython 2.6を提供しています。

次に、このドキュメントを見たところ、argparseはoptparseよりも優れており、特に意味のあるヘルプメッセージの生成について話しているときは、http//argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

そして、@ Nicholasによる" argparse vs. optparse " を見て、Python 2.7未満でargparseを利用できるようにした(そうですね、以前は知りませんでした)。

今、私の2つの懸念は十分に対処されています。私はそれが同様の考え方を持つ他の人を助けることを願ってこれを書きました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.