12

私のプログラムには、 argparseによって適切に解析された次のオプションが含まれている必要があります。

  1. 純粋にオプション:[-h, --help]および[-v, --version]
  2. 相互に排他的:[-f FILE, --file FILE]および[-u URL, --url URL]
  3. が選択された場合はオプション--url:[-V, --verbose]
  4. --fileまたはが選択された場合は必須--url:[-F, --format FORMAT]

望ましい使用パターンは次のとおりです。

prog.py [-h] [-v] [-f FILE (-F FORMAT) | -u URL [-V] (-F FORMAT) ]

この-F要件は、相互に排他的なグループの両方のメンバーに適用されます。
それがむしろ位置的なものであるかどうかはわかりません。

したがって、実行できるはずです:

prog.py -u "http://foo.bar" -V -F csv

そして、私が忘れた場合に備えてパーサーが叫んでいます-F(彼がそうするはずです)。

私がこれまでに行ったこと:

parser = ArgumentParser(decription='foo')

group = parser.add_mutually_exclusive_group()    
group.add_argument('-f','--file', nargs=1, type=str, help='')
group.add_argument('-u','--url', nargs=1, type=str, help='')    

parser.add_argument('-V','--verbose', action='store_true', default=False, help='')
parser.add_argument('-F','--format', nargs=1, type=str, help='')

コマンドライン引数なしで実行する「バニラモード」があるため、すべての引数はオプションである必要があります。

ポイント 3. と 4. をコードに実装するにはどうすればよいですか?

編集:ここで説明されているように、サブパーサーとして
試し-fてみましたが、サブコマンドは位置指定のように扱われるようで、パーサーは引数なしで実行すると、-uerror: too few arguments

4

2 に答える 2

5

nargs=2 と tuple metavar を使用すると、目標に近づく

parser = argparse.ArgumentParser(prog='PROG')
group = parser.add_mutually_exclusive_group()
group.add_argument('-f','--file', nargs=2, metavar=('FILE','FORMAT'))
group.add_argument('-u','--url', nargs=2, metavar=('URL','FORMAT'))
parser.add_argument('-V','--verbose', action='store_true',help='optional with url')

これは以下を生成します:

usage: PROG [-h] [-f FILE FORMAT | -u URL FORMAT] [-V]

optional arguments:
  -h, --help            show this help message and exit
  -f FILE FORMAT, --file FILE FORMAT
  -u URL FORMAT, --url URL FORMAT
  -V, --verbose         optional with url

これには、ファイル名または URL とともに形式が必要ですが、-F. 他の人が指摘-Vしたように、この場合は無視できます-f


here で説明されているように、サブパーサーとして -f と -u を試しましたが、サブコマンドは位置指定のように扱われるようで、パーサーはエラーを出します: 引数なしで実行すると引数が少なすぎます。

最新バージョンでは、サブコマンドは必須の定位置として扱われなくなりました。これは、私が知る限り、エラー メッセージをより有益なものに変更したことによる副作用です。代わりに_parse_known_args

    if positionals:
        self.error(_('too few arguments'))

スキャン_actionsして必要なものを確認し、エラー メッセージにそれらを名前別に一覧表示します。これはhttp://bugs.python.org/issue9253で議論されています。この変更は開発中 (3.4) であり、3.3 にも含まれる可能性があることは知っています。


于 2013-07-26T03:07:01.347 に答える