Pythonのコマンドラインの旅:深いargparse(B)


著者:HelloGitHub- Prodesire

「オープンソース・プロジェクトの説明」シリーズのHelloGitHub、プロジェクト住所:https://github.com/HelloGitHub-Team/Article

序文

前回の「綿密argparse(A)」の記事で、私たちの中に深い理解argparse能力を持つアクションを含むパラメータとパラメータの種類、などの基本的な機能は、簡単なコマンドラインプログラムを書き込みます。この記事では、深い理解続けるargparse先進的な遊びの、全体像にスパイを、私たちは、複雑なコマンドラインプログラムの達成を支援する能力を持っています。

本系列文章默认使用 Python 3 作为解释器进行讲解。
若你仍在使用 Python 2,请注意两者之间语法和库的使用差异哦~

助けます

ヘルプの自動生成

あなたは、コマンドラインプログラムに指定した場合-h--helpパラメータ、出力が役立ちます。そして、argparse指定することで、add_helpパラメータをあるTrueか、自動出力ヘルプ情報を得るためには、指定されていません。

>>> import argparse
>>> parser = argparse.ArgumentParser(add_help=True)
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-h'])
usage: [-h] [--foo FOO]

optional arguments:
  -h, --help  show this help message and exit
  --foo FOO

場合はadd_help=False、コマンドラインで指定した-hエラーになります。

>>> import argparse
>>> parser = argparse.ArgumentParser(add_help=False)
>>> parser.add_argument('--foo')
>>> parser.parse_args(['-h'])
usage: [--foo FOO]
: error: unrecognized arguments: -h

カスタムヘルプ

ArgumentParser使用してformatter_class出力形式を制御するのを助けるためにパラメータを。
たとえば、指定することによりformatter_class=argparse.RawTextHelpFormatter、我々は、元の形式に従ってコンテンツを作るのを助けることができます。

>>> import argparse
>>> parser = argparse.ArgumentParser(
...     add_help=True,
...     formatter_class=argparse.RawTextHelpFormatter,
...     description="""
...     description
...         raw
...            formatted"""
... )
>>> parser.add_argument(
...     '-a', action="store_true",
...     help="""argument
...         raw
...             formatted
...     """
... )
>>>
>>> parser.parse_args(['-h'])
usage: [-h] [-a]

    description
        raw
           formatted

optional arguments:
  -h, --help  show this help message and exit
  -a          argument
                      raw
                          formatted

指定せずに比較formatter_classヘルプの出力は、次の2つの-a descirptionやヘルプコンテンツの違いを見つけることができます。

>>> import argparse
>>> parser = argparse.ArgumentParser(
...     add_help=True,
...     description="""
...     description
...         notraw
...            formatted"""
... )
>>> parser.add_argument(
...     '-a', action="store_true",
...     help="""argument
...         notraw
...             formatted
...     """
... )
>>> parser.parse_args(['-h'])
usage: [-h] [-a]

description notraw formatted

optional arguments:
  -h, --help  show this help message and exit
  -a          argument notraw formatted

パラメータ

時々、私たちは、ヘルプ情報を表示するときの表示を可能にするために一緒にグループ化されたパラメータを与える必要があります。

コマンドラインパラメータは、3つのオプションをサポートしている場合--user--passwordおよび--push両方が呼び出される前に配置する必要がありますauthentication彼らは、認証情報であることを示すために、パケット。だから我々は、使用することができますArgumentParser.add_argument_group満たすために:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> group = parser.add_argument_group('authentication')
>>> group.add_argument('--user', action="store")
>>> group.add_argument('--password', action="store")
>>> parser.add_argument('--push', action='store')
>>> parser.parse_args(['-h'])
usage: [-h] [--user USER] [--password PASSWORD] [--push PUSH]

optional arguments:
  -h, --help           show this help message and exit
  --push PUSH

authentication:
  --user USER
  --password PASSWORD

私たちは、私たちが助けたときにメッセージが出力されていることがわかります、--userそして--passwordオプションがに表示されauthenticationたパケット。

オプションパラメータのプレフィックス

あなたが気づいた場合、私は、prefixオプションのパラメータは異なる場合があります異なるプラットフォーム上のコマンドラインプログラムを知りません。接頭辞であるUnixの、で、例えば-、およびWindows上で、(例えば、コマンドラインプログラムのほとんどfindstr)オプションの引数のプレフィックス/

ではargparseUnixのコマンドライン規則を使用してオプションパラメータのデフォルトのプレフィックス、つまり-しかし、それはまた、ここでは、カスタム接頭辞をサポートしています例です。

>>> import argparse
>>> 
>>> parser = argparse.ArgumentParser(
...     description='Option prefix',
...     prefix_chars='-+/',
... )
>>> 
>>> parser.add_argument('-power', action="store_false",
...                     default=None,
...                     help='Set power off',
...                     )
>>> parser.add_argument('+power', action="store_true",
...                     default=None,
...                     help='Set power on',
...                     )
>>> parser.add_argument('/win',
...                     action="store_true",
...                     default=False)
>>> parser.parse_args(['-power'])
Namespace(power=False, win=False)
>>> parser.parse_args(['+power', '/win'])
Namespace(power=True, win=True)

この例では、我々は3つのオプションパラメータのプレフィックスを指定し-+そして/これ:

  • オプションパラメータを指定すること-powerとなるよう、power=False
  • オプションパラメータを指定すること+powerとなるよう、power=True
  • オプションパラメータを指定すること/winとなるよう、win=True

シェアパーサ

私たちは、パラメータの設定内で共有するためにパーサを共有する必要がございます。例えば、我々はアリAWSクラウドのためのコマンドラインツールをサポートし、操作の2種類を操作する必要がありますが指定するのに必要とされるAccessKeyIdAccessKeySecret、ユーザIDとパーミッションことを示すために。あなたはあまり重複したコードを行くことができるように、そして、シェアパーサーは、特に必要です。

私たちはで、これを行うことができbase.py、親パーサ、ストレージの定義AccessKey、共通のパーサとして、関連のパラメータの設定。次のサブパーサは、情報が自動的に生成するのに役立ちますので、指定された親パーサどこadd_help=Falseヘルプ情報には、自動的に生成されていません。

# bash.py
import argparse

parser = argparse.ArgumentParser(add_help=False)

parser.add_argument('--ak-id', action="store")
parser.add_argument('--ak-secret', action="store")

そして、それぞれ可能ali.pyaws.py別ににより、サブパーサを定義しparents、そのパラメータを親パーサを指定するパラメータ、とても一般的な遺伝パラメータ、および達成:

# ali.py
import argparse
import base

parser = argparse.ArgumentParser(
    parents=[base.parser],
)

parser.add_argument('--ros',
                    action="store_true",
                    default=False,
                    help='Using ROS service to orchestrate cloud resources')

print(parser.parse_args())
# aws.py
import argparse
import base

parser = argparse.ArgumentParser(
    parents=[base.parser],
)

parser.add_argument('--cloudformation',
                    action="store_true",
                    default=False,
                    help='Using CloudFormation service to orchestrate cloud resources')

print(parser.parse_args())

最終的な採用は-hパラメータ探していたali.pyaws.pyしている、サポートされているパラメータを共通パラメータ--ak-idおよび--ak-secret特定のパラメータであった--ros--cloudformation

$ python3 ali.py -h

usage: ali.py [-h] [--ak-id AK_ID] [--ak-secret AK_SECRET] [--ros]

optional arguments:
  -h, --help            show this help message and exit
  --ak-id AK_ID
  --ak-secret AK_SECRET
  --ros                 Using ROS service to orchestrate cloud resources
$ python3 aws.py -h

usage: aws.py [-h] [--ak-id AK_ID] [--ak-secret AK_SECRET] [--cloudformation]

optional arguments:
  -h, --help            show this help message and exit
  --ak-id AK_ID
  --ak-secret AK_SECRET
  --cloudformation      Using CloudFormation service to orchestrate cloud
                        resources

ネストされたパーサ

私たちは、コマンドラインを導入する前に、通常のフォームを使用しますcli --a --b xxxしかし、非常に一般的なコマンドラインの使用がされていますcli subcmd --a --b xxx例えば、我々は渡したいときgit、プッシュラベル、それが使用されるときgit push --tags

私たちは、簡単にネスティングパーサを解析することによって、これらのコマンドの種を形成することができます。

ネストされたパーサーでは、我々は、親パーサ全体コマンドラインエントリとして定義し、全体の機能を実現することができる次いで、対応するN個のサブNサブコマンドパーサを定義します。

次の例では、我々はサポートcreateしてdelete指定されたパスを作成または削除するために、2つのサブコマンドを。deleteコマンドはサポートして--recursive再帰的に指定されたパスを削除するかどうかを示すためのパラメータを:

# cli.py
import argparse

parser = argparse.ArgumentParser()

subparsers = parser.add_subparsers(help='commands')

# Create
create_parser = subparsers.add_parser(
    'create', help='Create a directory')
create_parser.add_argument(
    'dirname', action='store',
    help='New directory to create')

# Delete
delete_parser = subparsers.add_parser(
    'delete', help='Remove a directory')
delete_parser.add_argument(
    'dirname', action='store', help='The directory to remove')
delete_parser.add_argument(
    '--recursive', '-r', default=False, action='store_true',
    help='Recursively remove the directory',
)

print(parser.parse_args())

直接指定された-hサポートされたサブコマンドとパラメータオプションを表示します:

$ python3 cli.py -h

usage: cli.py [-h] {create,delete} ...

positional arguments:
  {create,delete}  commands
    create         Create a directory
    delete         Remove a directory

optional arguments:
  -h, --help       show this help message and exit

直接指定delete -h確認するためにdelete子供の養育費のためのパラメータオプションを:

$ python3 cli.py delete -h

usage: cli.py delete [-h] [--recursive] dirname

positional arguments:
  dirname          The directory to remove

optional arguments:
  -h, --help       show this help message and exit
  --recursive, -r  Recursively remove the directory

カスタムアクション

動きパラメータの8種類の導入前「深いargparse(A)」の記事では、ほとんどのシナリオをカバーするように言うことができます。しかし、いくつかの特定の要件は、たとえば、あなたは値が大文字でパラメータを取得したい、そこに満たすことができないであろう。この場合は、カスタムアクションが便利になりました。

継承するカスタムクラスアクション、実装argparse.Action、クラスに渡されるカスタムアクションArgumentParser.add_argumentaction引数を。パーサパラメータは、呼び出したときに、クラス__call__メソッドのシグネチャは__call__(self, parser, namespace, values, option_string=None)、ここで:

  • パーサパーサのインスタンス
  • 名前空間の店舗解析結果
  • 値は、コマンドラインパラメータが渡され、すなわち
  • パラメータオプションをoption_string

次の例では、我々は合格--words入ってくる言葉を、その値は、カスタムアクションで大文字に変換されます。

# cli.py
import argparse

class WordsAction(argparse.Action):

    def __call__(self, parser, namespace, values,
                 option_string=None):
        print(f'parser = {parser}')
        print(f'values = {values!r}')
        print(f'option_string = {option_string!r}')

        values = [v.upper() for v in values]
        setattr(namespace, self.dest, values)


parser = argparse.ArgumentParser()
parser.add_argument('--words', nargs='*', action=WordsAction)

results = parser.parse_args()
print(results)
$ python3 cli.py --words foo bar

parser = ArgumentParser(prog='cli.py', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
values = ['foo', 'bar']
option_string = '--words'
Namespace(words=['FOO', 'BAR'])

セクション

argparse漸進的アプローチの導入、私はあなたが包括的に理解してい信じるargparse力を、だけでなく、コマンドラインツールを開発する能力を持っています。しかし、「紙がZhongjueはこの練習が不可欠です知っています。」

次の記事では、我々は一緒になりますargparse日常業務の一般的なgitいくつかは、それについて興奮しないと思う、コマンドを?

おすすめ

転載: www.cnblogs.com/xueweihan/p/11415703.html