私はこのようなことを達成したいです:
-LoadFiles
-SourceFile "" -DestPath ""
-SourceFolder "" -DestPath ""
-GenericOperation
-SpecificOperation -Arga "" -Argb ""
-OtherOperation -Argc "" -Argb "" -Argc ""
ユーザーは次のようなことを実行できるはずです。
-LoadFiles -SourceFile "somePath" -DestPath "somePath"
または
-LoadFiles -SourceFolder "somePath" -DestPath "somePath"
基本的に、-LoadFiles
を使用している場合は、後に-SourceFile
または-SourceFolder
を使用する必要があります。 -SourceFile
をお持ちの場合は、-DestPath
などが必要です。
他の引数に必要な引数のこのチェーンは可能ですか?そうでない場合、少なくとも次のようなことはできますか。-SourceFile
がある場合は、-DestPath
が必要です。
作成したArgumentParser
インスタンスでparse_args
を呼び出すと、Namespace
オブジェクトが提供されます。引数の1つが存在する場合、もう1つの引数も存在する必要があることを確認してください。お気に入り:
args = parser.parse_args()
if ('LoadFiles' in vars(args) and
'SourceFolder' not in vars(args) and
'SourceFile' not in vars(args)):
parser.error('The -LoadFiles argument requires the -SourceFolder or -SourceFile')
Argparseでサブパーサーを使用できます
import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('--foo', required=True, help='foo help')
subparsers = parser.add_subparsers(help='sub-command help')
# create the parser for the "bar" command
parser_a = subparsers.add_parser('bar', help='a help')
parser_a.add_argument('bar', type=int, help='bar help')
print(parser.parse_args())
あなたが言及したようなケースを簡単に管理できるいくつかのargparse
代替案があります。 click または docopt のようなパッケージ。
Argparseでチェーン引数の手動実装を回避したい場合は、たとえばクリックで Commands and Groups を確認してください。
--makeDependencyを指定した場合に、値とともに--dependencyも指定するように強制するサンプルを以下に示します。
これはargparseだけで行われるのではなく、後でユーザーが指定したものを検証するプログラムによっても行われます。
#!/usr/bin/env python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--makeDependency', help='create dependency on --dependency', action='store_true')
parser.add_argument('--dependency', help='dependency example')
args = parser.parse_args()
if args.makeDependency and not args.dependency:
print "error on dependency"
sys.exit(1)
print "ok!"