python 3コマンドラインパラメータ処理ライブラリargparse、docopt、click、fire概要

7675 ワード

一、前言
半年近くのPython命令行の旅の中で、私たちは順番に勉強しました.  argparsedocoptclick  および  fire  ライブラリの特徴と使い方は、Pythonコマンドラインライブラリの設計哲学と発展を徐々に理解している.
本稿では,今回の旅の終点として,これらのライブラリをより高い視点から横方向に比較し,それらの異同点と使用シーンをまとめ,異なるシーンに対応する際に利害を分析し,適切なライブラリを自分のために選択することを期待する.
このシリーズでは、解釈器としてPython 3をデフォルトで使用して説明します.Python 2を使用している場合は、文法とライブラリの違いに注意してください.
 
二、設計理念
各ライブラリの設計理念を議論する前に、まず1つ を設計します.  argparse  ライブラリの最初の説明に登場しました.つまり、
  • コマンドラインプログラムは、複数回出現可能な位置パラメータを1つ受け入れ、数字である
  • デフォルトでは、コマンドラインプログラムが与えられた一連の数字の最大値を求める
  • オプションパラメータが指定されている場合  --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  表示タイプはint
  • このパラメータは何度も繰り返し表示され、例えば  nargs='+'  少なくとも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  辞書に変換してすべての処理をビジネスロジックに渡す方法がさらに複雑になる
  • 2.3、click
    コマンドラインプログラムは本質的にパラメータと処理パラメータを定義し、処理パラメータの論理は定義されたパラメータに関連しているに違いない.では、処理パラメータロジックと定義パラメータの関連付けを関数と装飾器で実現できますか?そして  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」を入力することも合法であることを意味し、これは厳格なコマンドラインプログラムが自分のビジネスロジックの中で所望のタイプを制約しなければならないことを意味する.
     
    三、横の対比
    最後に、横比較でargparsedocoptclick および  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のコマンドラインライブラリは種類が多く、それぞれ特色があります.上記のまとめに合わせて、使用シーンに合ったライブラリを選択し、いくつかのライブラリが合っている場合は、より好みのスタイルに合わせて選択します.これらのライブラリはすべて優秀で、その背後にある思想は私たちが学ぶ価値があり、拡張する価値があります.