カスタムアクションを使用します。
import argparse
foo_default=None
class BarAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
didfoo=getattr(namespace,'foo',foo_default)
if(didfoo == foo_default):
parser.error("foo before bar!")
else:
setattr(namespace,self.dest,values)
parser=argparse.ArgumentParser()
parser.add_argument('--foo',default=foo_default)
parser.add_argument('--bar',action=BarAction,help="Only use this if --foo is set")
#testing.
print parser.parse_args('--foo baz'.split())
print parser.parse_args('--foo baz --bar cat'.split())
print parser.parse_args('--bar dog'.split())
これもあなたがargparseの一部の文書化されていない動作に依存してOKなら仕方を維持するために、少し簡単に行うことができますで
import argparse
parser=argparse.ArgumentParser()
first_action=parser.add_argument('--foo',dest='cat',default=None)
class BarAction(argparse.Action):
def __call__(self,parser,namespace,values,option_string=None):
didfoo=getattr(namespace,first_action.dest,first_action.default)
if(didfoo == first_action.default):
parser.error("foo before bar!")
else:
setattr(namespace,self.dest,values)
parser.add_argument('--bar',action=BarAction,
help="Only use this if --foo is set")
#testing.
print parser.parse_args('--foo baz'.split())
print parser.parse_args('--foo baz --bar cat'.split())
print parser.parse_args('--bar dog'.split())
この例では、foo
のデフォルトを取得し、add_argument
によって返されたアクションオブジェクトからの宛先を取得します(add_argumentの戻り値はどこにも記載されていません)。これはまだ少し脆いです(たとえば、--foo
引数にtype=
キーワードを指定する場合)。
最後に、解析する前にsys.argv
をチェックすることができます。
import sys
if ("--parameter2" in sys.argv) and ("--parameter1" not in sys.argv):
parser.error("parameter1 must be given if parameter2 is given")
--parameter1
も--p1
によってトリガすることができますが、あなたのアイデアを得る場合、これはもう少しトリッキー取得します。次に使用することができます
if (set(sys.argv).intersection(('--p2',...)) and
not set(sys.argv).intersection(('--p1',...)))
ここでの利点は、特別な注文を必要としないことです。 (--p2
はコマンドラインで--p1
に従う必要はありません)。また、前と同じように、option_strings
属性を使用して特定のアクションをトリガーするコマンド文字列のリストを取得することができます。これはparser.add_argument(...)
によって返されます。例えば
import argparse
import sys
parser=argparse.ArgumentParser()
action1=parser.add_argument('--foo')
action2=parser.add_argument('--bar',
help="Only use this if --foo is set")
argv=set(sys.argv)
if ((argv & set(action2.option_strings)) and
not (argv & set(action1.option_strings))):
#^ set intersection
parser.error(' or '.join(action1.option_strings)+
' must be given with '+
' or '.join(action2.option_strings))
あなたは 'myScript.py --parameter2値2 --parameter1 value1'場合に発生することが何をしたいですか?あなたがそれを通過させたい場合、対処するのは非常に難しいケースです。 – mgilson
http://bugs.python.org/issue11588は 'mutually_inclusive_group'機能のバグリクエストです。この場合、 '--parameter1'は' --parameter2'なしで実行できるので、これはうまくいきません。この問題や関連する制約をどのように実装できるかについてのアイデアがあれば、その問題に貢献してください。 – hpaulj