2017-01-17 5 views
0

Ich versuche parser = argparse.ArgumentParser für ein lil Programm zu verwenden, das ich schreibe.Verwenden von argparse, um nur eine Gruppe von erforderlichen Argumenten zu akzeptieren

Das Programm akzeptiert als Eingang EITHER( ein Pfad zu einer Datei txt )OR( OPT1 && opt2 && OPT3 ).

Wenn der Benutzer eine txt-Datei als Eingabe verwenden möchte, kann er weder opt noch opt angeben - er muss alle 3 bereitstellen und keine a path to a txt file bereitstellen.

Ich versuchte mit add_mutually_exclusive_group aber nicht sicher, wie, weil die zweite Gruppe von Argumenten eine Gruppe selbst ist.

Das ist, was ich bisher versucht:

import argparse 
parser = argparse.ArgumentParser(description='this is the description',) 

root_group = parser.add_mutually_exclusive_group() 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-path', help='path to the txt file') 

group_list = root_group.add_mutually_exclusive_group() 
group_list.add_argument('-opt1', help='opt1') 
group_list.add_argument('-opt2', help='opt2') 
group_list.add_argument('-opt3', help='opt3') 

args = parser.parse_args() 

-

python tests.py -path txt -opt1 asdasd 
usage: tests.py [-h] [[-path PATH] [-opt1 OPT1 | -opt2 OPT2 | -opt3 OPT3] 
tests.py: error: argument -opt1: not allowed with argument -path 

path mit einem opt nicht erlaubt - das ist genau das, was ich will.

Aber ich möchte, dass, wenn der Benutzer sogar 1 opt er wird sie alle zur Verfügung stellen müssen.

Ich möchte auch, dass mindestens 1 Gruppe zufrieden sein muss.

+1

Bitte zeigen Sie, was Sie versucht haben, und erklären Sie, wie es nicht angemessen war. –

+0

hat den ersten Post bearbeitet. Danke –

+0

Ihr Titel ist irreführend, dann; Sie wollen alles oder nichts von einer Reihe von Optionen. –

Antwort

0

Sich gegenseitig ausschließende Gruppen sind nicht zum Verschachteln vorgesehen. Es akzeptiert Ihren Code, aber der Nettoeffekt macht 4 Argumente exklusiv. Es akzeptiert nur eine von path, opt1, opt2 usw.

Während ich Verschachtelung Gruppen erforscht definiert und ermöglicht any oder and Operationen innerhalb von Gruppen, ein solches Merkmal ist ein langer Weg.

Da Ihr Benutzer alle 3 --opt zu bieten hat würde ich Kondensieren lassen vermuten, dass in ein Argument:

root_group.add_argument('--opt', nargs=3) 
root_group.add_argument('--path') 

Verwendung so etwas wie

usage: tests.py [-h] [--path PATH | --opt OPT OPT OPT] 

Kontrast aussehen sollte, dass mit einer hypothetischen Nutzung, die erlaubt nested inclusive groups:

[-path PATH | [-opt1 OPT1 & -opt2 OPT2 & -opt3 OPT3]] 

========= ==

Mit einem Tupel metavar kann die Nutzung verfeinert werden:

g.add_argument('--opt',nargs=3,metavar=('OPT1','OPT2','OPT3')) 

usage: ipython3 [-h] [--path PATH | --opt OPT1 OPT2 OPT3] 

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

andere Option eine benutzerdefinierte schreiben usage und führen Sie nach dem Parsing eigene logische Tests durch.

Verwandte Themen