44215


以下の例では`-m`をrequired指定していますが、`--version`が指定されたときは、`-m`が未指定でも、バージョン情報を出力して終了する、ということをやりたいです。何か方法はないでしょうか？

[code]

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    import pkg_resources
    import sys
    import argparse
    
    argparser = argparse.ArgumentParser(
        description='This tool will help local development of mbed',
        formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    argparser.add_argument(
        '-m', '--target',
        required=True,
        help='Compile target MCU. @see https://github.com/ARMmbed/mbed-cli')
    
    argparser.add_argument(
        '--version',
        required=False,
        default=False,
        action='store_true',
        help='Print version info')
    
    args = argparser.parse_args()
    
    if args.version:
        print('xmbedinit {}'.format(
            pkg_resources.require('xmbedinit')[0].version))
        sys.exit()
    
[/code]


CC BY-SA 4.0
2018-05-24T06:52:35.447
44212
2018-05-25T03:38:20.857
17238
question
python
Pythonのargparseで特定のオプションが指定されている時はrequiredを抑制したい


`--version` に関しては、ご所望の動作をするような action として `'version'` が用意されています。

[code]

    argparser.add_argument('--version', action='version', version='%(prog)s 2.0')
    
[/code]

参考: [argparse のドキュメントにおける action
の節](https://docs.python.org/3/library/argparse.html#action)


CC BY-SA 4.0
2018-05-24T07:27:54.530
44215
2018-05-24T07:31:40.950
2018-05-24T07:31:40.950
19110
19110
44212
answer


すでに承認回答がついてしまっていますが、[相互排他グループ](https://docs.python.org/ja/3/library/argparse.html#mutual-
exclusion)を使うと`--version`以外の場合も対応できそうですね。`-m`と`--version`のORをとったオプションを作ってそれ自体を`required`にしてしまうという方法です。

[code]

    group = argparser.add_mutually_exclusive_group(required=True)
    
    group.add_argument(
        '-m', '--target',
        help='Compile target MCU. @see https://github.com/ARMmbed/mbed-cli')
    
    group.add_argument(
        '--version',
        default=False,
        action='store_true',
        help='Print version info')
    
[/code]

[code]

    % python3 test.py 
    usage: test.py [-h] (-m TARGET | --version)
    test.py: error: one of the arguments -m/--target --version is required
    
[/code]

ただ、`--version`のような特殊なオプションの場合は、このようなメッセージは不親切な気もしますね。またmasmさんの指摘にもあるとおり、あくまでも相互排他であるため両方のオプションを同時に指定できません。


CC BY-SA 4.0
2018-05-24T09:58:43.060
44220
2018-05-25T03:38:20.857
2018-05-25T03:38:20.857
13199
13199
44212
answer