3

次のような使用法でスクリプトを作成しようとしています。

my_script [-p parg -l larg] | [-s sarg]

つまり、スクリプトは引数または-p引数のいずれかを取ります。と の両方を指定するとエラーになります。次のことを試しましたが、うまくいかないようです-l -s-p-s

import argparse
parser = argparse.ArgumentParser(description='Some Desc')
gp = parser.add_mutually_exclusive_group()
num_gp = gp.add_argument_group()
num_gp.add_argument('-p')
num_gp.add_argument('-l')
gp.add_argument('-s')
In [18]: parser.parse_args(['-p blahp', '-l blahl', '-s blahs'])
Out[18]: Namespace(l=' blahl', p=' blahp', s=' blahs') #ERROR Should have failed as I specify both `-p` and `-s` which belong to a mutually_exclusive_group
4

1 に答える 1

0

相互に排他的なグループを悪用していると思います。グループは他のグループと相互に排他的ではなく、グループのメンバーは相互に排他的です。また、ドキュメントからわかる限り、標準グループは解析ロジックに影響を与えず、パーサーによって生成されたヘルプ メッセージを整理するのに役立つだけです。

たとえば、相互に排他的な2 つのオプションを作成する方法を次に示します-p-s

import argparse

parser = argparse.ArgumentParser(description='Some Desc')
group1 = parser.add_mutually_exclusive_group()
group1.add_argument("-p")
group1.add_argument("-s")

# This works
args = parser.parse_args(["-p", "argForP"])
# This will throw an error
args = parser.parse_args(["-p", "argForP", "-s", "argForS"])

しかし、引数が 2 つの相互に排他的なグループに属することができるかどうかわからないため、この機能によってユース ケースを実装できるかどうかはわかりません。ただし、いつでも自分でエラーチェックを行うことができ、parser.error. それは次のようになります。

message = "invalid options"

# Tells us p is used without l or vise versa
if (args.p is None) != (args.l is None):
    parser.error(message)

# Tells is if p-l is used with s
if (args.p is None) == (args.s is None):
    # Either both are used or neigher
    parser.error(message)
于 2013-10-22T00:11:37.700 に答える