python 3コマンドラインパラメータ処理ライブラリargparse、docopt、click、fire概要
7675 ワード
一、前言
半年近くのPython命令行の旅の中で、私たちは順番に勉強しました.
本稿では,今回の旅の終点として,これらのライブラリをより高い視点から横方向に比較し,それらの異同点と使用シーンをまとめ,異なるシーンに対応する際に利害を分析し,適切なライブラリを自分のために選択することを期待する.
このシリーズでは、解釈器としてPython 3をデフォルトで使用して説明します.Python 2を使用している場合は、文法とライブラリの違いに注意してください.
二、設計理念
各ライブラリの設計理念を議論する前に、まず1つコマンドラインプログラムは、複数回出現可能な位置パラメータを1つ受け入れ、数字である デフォルトでは、コマンドラインプログラムが与えられた一連の数字の最大値を求める オプションパラメータが指定されている場合 この例を各ライブラリで実装するコードから,それらの設計理念をさらに理解したい.
2.1、argparse
次の例は
上記の例から、位置パラメータ そのタイプは何か、例えば このパラメータは何度も繰り返し表示され、例えば パラメータは何が保存されているのか、例えば 次に、与えられたこれらのメタ情報に基づいてコマンドラインパラメータ(すなわち、例の
これはコンピューターの思考で、冗長だが柔軟性をもたらした.
2.2、docopt
から
宣言式の利点は、宣言式の構文をマスターすれば、コマンドラインのメタ情報を定義するのが簡単になることです.
次の例は
上記の例から、
比較より複雑なコマンドプログラムについては、メタ情報の定義上 しかしビジネスロジックの処理においては、 2.3、click
コマンドラインプログラムは本質的にパラメータと処理パラメータを定義し、処理パラメータの論理は定義されたパラメータに関連しているに違いない.では、処理パラメータロジックと定義パラメータの関連付けを関数と装飾器で実現できますか?そして
次の例は
上記の例から分かるように、パラメータと対応する処理ロジックは非常によく結合されており、直感的に見え、パラメータがどのように処理されるかを明確に理解することができ、これは多くのパラメータがある場合に特に重要である.
また、
2.4、fire
次の例は
上記の例から分かるように、
しかし、有利には自然に弊害もあります.例えば
三、横の対比
最後に、横比較で
argpase
docopt
click
fire
ステップ数の使用
4ステップ
3ステップ
2ステップ
1ステップ
ステップ数の使用
1.解析器の設定2.パラメータの定義3.コマンドラインの解析4.ビジネスロジック
1.インタフェース記述の定義2.コマンドラインの解析3.ビジネスロジック
1.ビジネスロジック2.パラメータの定義
1.業務ロジック
オプションパラメータ(例:
✔
✔
✔
✔
位置パラメータ(例:
✔
✔
✔
✔
パラメータのデフォルト
✔
✘
✔
✔
反発オプション(例:
✔
✔
✔ サードパーティ製ライブラリによるサポート
✘
可変パラメータ(複数指定など)
✔
✔
✔
✔
ネスト/ペアレントコマンド
✔
✔
✔
✔
ツールボックス
✘
✘
✔
✔
チェーンコマンド呼び出し
✘
✘
✘
✔
タイプコンストレイント
✔
✘
✔
✘
Pythonのコマンドラインライブラリは種類が多く、それぞれ特色があります.上記のまとめに合わせて、使用シーンに合ったライブラリを選択し、いくつかのライブラリが合っている場合は、より好みのスタイルに合わせて選択します.これらのライブラリはすべて優秀で、その背後にある思想は私たちが学ぶ価値があり、拡張する価値があります.
半年近くのPython命令行の旅の中で、私たちは順番に勉強しました.
argparse
、 docopt
、 click
および fire
ライブラリの特徴と使い方は、Pythonコマンドラインライブラリの設計哲学と発展を徐々に理解している.本稿では,今回の旅の終点として,これらのライブラリをより高い視点から横方向に比較し,それらの異同点と使用シーンをまとめ,異なるシーンに対応する際に利害を分析し,適切なライブラリを自分のために選択することを期待する.
このシリーズでは、解釈器としてPython 3をデフォルトで使用して説明します.Python 2を使用している場合は、文法とライブラリの違いに注意してください.
二、設計理念
各ライブラリの設計理念を議論する前に、まず1つ
を設計します. argparse
ライブラリの最初の説明に登場しました.つまり、--sum
で、与えられた一連の数字を求める和2.1、argparse
argparse
の設計理念はあなたに最も細粒度の制御を提供することで、パラメータがオプションパラメータなのか位置パラメータなのか、パラメータ値のタイプが何なのか、このパラメータの処理動作がどのようなものなのかを詳しく教える必要があります.つまり、知能分析能力のない初代ロボットのように、与えられた情報に基づいて仕事を助けるために明確な情報を伝える必要があります.次の例は
argparse
実装済み
: import argparse
# 1.
parser = argparse.ArgumentParser(description='Calculator Program.')
# 2.
# nums, num
# int, ,
parser.add_argument('nums', metavar='num', type=int, nargs='+',
help='a num for the accumulator')
# --sum, parser accumulate
# --sum, max , sum
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the nums (default: find the max)')
# 3.
args = parser.parse_args(['--sum', '1', '2', '3'])
print(args) # :Namespace(accumulate=, nums=[1, 2, 3])
# 4.
result = args.accumulate(args.nums)
print(result) # ['--sum', '1', '2', '3'] ,accumulate sum , 6
上記の例から、
add_argument
はっきりと教える argparse
パラメータの長さ:nums
、やはりオプションパラメータ --sum
type=int
表示タイプはintnargs='+'
少なくとも1つ提供することを示すaction='store_const'
表示定数['--sum', '1', '2', '3']
). これはコンピューターの思考で、冗長だが柔軟性をもたらした.
2.2、docopt
から
argparse
の理念から、命令式であることがわかります.このとき docopt
別の道を切り開いて、声明式でもいいのではないでしょうか.コマンドラインプログラムのヘルプ情報には、このコマンドラインの完全なメタ情報が含まれています.ヘルプ情報を定義することで、コマンドラインを定義することができます.docopt
このような考えに基づいて設計されたのです.宣言式の利点は、宣言式の構文をマスターすれば、コマンドラインのメタ情報を定義するのが簡単になることです.
次の例は
docopt
実装済み
: # 1. /
"""Calculator Program.
Usage:
calculator.py [--sum] ...
calculator.py (-h | --help)
Options:
-h --help Show help.
--sum Sum the nums (default: find the max).
"""
from docopt import docopt
# 2.
arguments = docopt(__doc__, options_first=True, argv=['--sum', '1', '2', '3'])
print(arguments) # :{'--help': False, '--sum': True, '': ['1', '2', '3']}
# 3.
nums = (int(num) for num in arguments[''])
if arguments['--sum']:
result = sum(nums)
else:
result = max(nums)
print(result) # ['--sum', '1', '2', '3'] , sum , 6
上記の例から、
__doc__
インタフェースの説明を定義し、 argparse
中 add_argument
等価で、そして docopt
このメタ情報に基づいてコマンドラインパラメータを辞書に変換します.ビジネスロジックでは、この辞書を処理する必要があります.比較
argparse
: docopt
もっと簡単になるargparse
いくつかの単純なパラメータの処理は、比較的便利です(例の場合など). docopt
辞書に変換してすべての処理をビジネスロジックに渡す方法がさらに複雑になるコマンドラインプログラムは本質的にパラメータと処理パラメータを定義し、処理パラメータの論理は定義されたパラメータに関連しているに違いない.では、処理パラメータロジックと定義パラメータの関連付けを関数と装飾器で実現できますか?そして
click
ちょうどこのような使い方で設計されています.click
装飾器を使用する利点は、装飾器の優雅な構文でパラメータ定義と処理ロジックを統合し、ルーティング関係を暗示することである.と比較 argparse
および docopt
解析後のパラメータを自分でルーティングする必要があり,ずいぶん簡単になった.次の例は
click
実装済み
: import sys
import click
sys.argv = ['calculator.py', '--sum', '1', '2', '3']
# 2.
@click.command()
@click.argument('nums', nargs=-1, type=int)
@click.option('--sum', 'use_sum', is_flag=True, help='sum the nums (default: find the max)')
# 1.
def calculator(nums, use_sum):
"""Calculator Program."""
print(nums, use_sum) # :(1, 2, 3) True
if use_sum:
result = sum(nums)
else:
result = max(nums)
print(result) # ['--sum', '1', '2', '3'] , sum , 6
calculator()
上記の例から分かるように、パラメータと対応する処理ロジックは非常によく結合されており、直感的に見え、パラメータがどのように処理されるかを明確に理解することができ、これは多くのパラメータがある場合に特に重要である.
click
と比較 argparse
および docopt
最も明らかな優位性.また、
click
Bash補完、色、ページングサポート、進捗バーなど、多くのユーティリティと追加の機能も内蔵されており、虎に翼を添えることができます.2.4、fire
fire
クラス、関数、辞書、リストなど、より柔軟で簡単なコマンドラインを一般化されたオブジェクト向けに遊ぶことができます.パラメータタイプを定義する必要はありませんfire
入力とパラメータのデフォルト値に基づいて自動的に判断され、実装プロセスがさらに簡素化されるに違いありません.次の例は
click
実装済み
: import sys
import fire
sys.argv = ['calculator.py', '1', '2', '3', '--sum']
builtin_sum = sum
# 1.
# sum=False, --sum, False
# *nums
def calculator(sum=False, *nums):
"""Calculator Program."""
print(sum, nums) # :True (1, 2, 3)
if sum:
result = builtin_sum(nums)
else:
result = max(nums)
print(result) # ['1', '2', '3', '--sum'] , sum , 6
fire.Fire(calculator)
上記の例から分かるように、
fire
提供方法は間違いなく最も簡単で、最もPythonicです.ビジネスロジックに注目するだけで、コマンドラインパラメータの定義は関数パラメータの定義と一体化します.しかし、有利には自然に弊害もあります.例えば
nums
どんなタイプであるかは言わないが、文字列「abc」を入力することも合法であることを意味し、これは厳格なコマンドラインプログラムが自分のビジネスロジックの中で所望のタイプを制約しなければならないことを意味する.三、横の対比
最後に、横比較で
argparse
・docopt
・click
および fire
ライブラリの各機能と特徴:argpase
docopt
click
fire
ステップ数の使用
4ステップ
3ステップ
2ステップ
1ステップ
ステップ数の使用
1.解析器の設定2.パラメータの定義3.コマンドラインの解析4.ビジネスロジック
1.インタフェース記述の定義2.コマンドラインの解析3.ビジネスロジック
1.ビジネスロジック2.パラメータの定義
1.業務ロジック
オプションパラメータ(例:
--sum
) ✔
✔
✔
✔
位置パラメータ(例:
X Y
) ✔
✔
✔
✔
パラメータのデフォルト
✔
✘
✔
✔
反発オプション(例:
--car
および --bus
二者択一しかできません)✔
✔
✔ サードパーティ製ライブラリによるサポート
✘
可変パラメータ(複数指定など)
--file
) ✔
✔
✔
✔
ネスト/ペアレントコマンド
✔
✔
✔
✔
ツールボックス
✘
✘
✔
✔
チェーンコマンド呼び出し
✘
✘
✘
✔
タイプコンストレイント
✔
✘
✔
✘
Pythonのコマンドラインライブラリは種類が多く、それぞれ特色があります.上記のまとめに合わせて、使用シーンに合ったライブラリを選択し、いくつかのライブラリが合っている場合は、より好みのスタイルに合わせて選択します.これらのライブラリはすべて優秀で、その背後にある思想は私たちが学ぶ価値があり、拡張する価値があります.