2016-05-18 16 views
1

Also benutze ich argparse und ich versuche etwas zu schaffen, dass ich nirgends die Lösung finden kann.Gruppe in einer Gruppe ArgParse

Ich versuche [A | [B C]] zu tun. Also entweder ich habe A oder (B and C).

EDIT So einige Beispiel-Code wäre

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group(required=False) 
group.add_argument("-a") 
more = group.add_mutually_exclusive_group() 
more.add_argument("-b") 
more.add_argument("c") 

Dies ist jedoch endet mich geben [A | [B | C]]

+1

Klingt, als ob Sie [Unterbefehle] (https://docs.python.org/3/library/argparse.html#sub-commands) benötigen, aber mehr Informationen und einige Beispielcodes wären hilfreich. – ChrisP

Antwort

1

Der sich gegenseitig ausschließende Gruppenmechanismus ist nur für eine einfache (flache) Exklusivität oder Gruppe. Es gibt keinen Mechanismus zum Verschachteln einer Gruppe in einer anderen oder zum Anwenden anderer Logik (and, any usw.).

Sie müssen nach dem Parsing eigene Tests durchführen. Solange die Standardeinstellungen angemessen sind (z. B. die Standardvorgabe None), ist das nicht schwer.

Subparser bieten eine andere Art von Gruppierungslogik, die für Sie arbeiten kann.

Dies wurde in anderen SO-Fragen und einem Python-Bug/Problem angesprochen, wenn Sie es genauer untersuchen müssen.

===============

argument groups, trotz des Namens, arbeiten nicht mit einander ausschließende Gruppen. Ihr Verwendungszweck ist völlig anders (Gruppierung von Hilfslinien). Sie können eine sich gegenseitig ausschließende Gruppe in eine andere verschachteln, aber der Nettoeffekt besteht darin, alles in eine Gruppe einzuordnen.

argparse: some mutually exclusive arguments in required group

============================

import argparse 

usage = '%(prog)s [A | [B ? C]]' 
parser = argparse.ArgumentParser(usage=usage) 
parser.add_argument('-a') 
parser.add_argument('-b') 
parser.add_argument('-c') 
args=parser.parse_args() 

print(args) 
if args.a is not None: 
    if not(args.b is None and args.c is None): 
     parser.error('Cannot use b or c with a') 

mit resultierenden Läufe

1722:~/mypy$ python3 stack37311550.py -a 1 
Namespace(a='1', b=None, c=None) 
1726:~/mypy$ python3 stack37311550.py -a 1 -b2 
Namespace(a='1', b='2', c=None) 
usage: stack37311550.py [A | [B ? C]] 
stack37311550.py: error: Cannot use b or c with a 
1726:~/mypy$ python3 stack37311550.py -c3 -b2 
Namespace(a=None, b='2', c='3') 
1726:~/mypy$ python3 stack37311550.py -c3 -b2 -a1 
Namespace(a='1', b='2', c='3') 
usage: stack37311550.py [A | [B ? C]] 
stack37311550.py: error: Cannot use b or c with a 
1
import argparse 

parser = argparse.ArgumentParser(description='test group') 
subparsers = parser.add_subparsers(help='sub-commands help') 
sp = subparsers.add_parser('A', help='A command') 
sp.set_defaults(cmd = 'A') 
sp = subparsers.add_parser('B', help='B command') 
sp.set_defaults(cmd = 'B') 
sp.add_argument('C', help='C option') 

args = parser.parse_args() 

if (args.cmd == 'A'): 
    print("running A mode") 
else: 
    print("running B mode with C=%s" % args.C) 

Hier Ausführungsprotokoll:

$ python test.py A 
running A mode 
$ python test.py B 
usage: test.py B [-h] C 
$ python test.py B some 
running B mode with C=some 

Unvereinbare Gruppen sollen für Fälle, in denen der Benutzer genau eine Option auswählen muss einer gegebenen Menge.