web-dev-qa-db-ja.com

optparseではなくargparseを使用する理由

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

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

268
fmark

python 2.7の時点で、 optparse は非推奨であり、将来的には廃止される予定です。

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

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

詳細情報は PEP 389 にもあります。これは、argparseが標準ライブラリに入れた手段です。

297
Nicholas Knight

Optparseの代わりに使用する必要があるのはなぜですか?知っておくべき新機能はありますか?

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

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

有用なモジュールが標準ライブラリに追加されたとき、それはジレンマのナンバーワンです。同じ種類の機能を提供するための大幅に改善された、しかし後方互換性のない方法が現れたらどうしますか?

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

「非推奨」である古い方法についてドキュメントで脅迫的な不平を言うかもしれませんが、(後方互換性を維持する必要がある限り)大きくて重要なアプリケーションが新しいPythonリリース。

(あなたの質問に直接関係しないジレンマ2は、「標準ライブラリは良いパッケージが死ぬ場所である」という古い言葉に要約されています...毎年リリースされており、そうではないパッケージ、 非常に安定、ではないそれよりも頻繁にリリースが必要で、実際には標準ライブラリで「フリーズ」されることで実質的に苦しむ可能性があります...しかし、それは本当に別の問題です) 。

60
Alex Martelli
34
Ned Batchelder

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

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

さらに詳細な比較が必要な場合は、 this をお読みください。docoptまたはクリック。カイル・パードンに感謝します!

14
lony

最初は、@ 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つの懸念は十分に解決されました。私はこれが同じような考え方を持つ他の人を助けることを期待して書いた。

4
RayLuo