2016-04-28 6 views
0

Wie soll ich die Argase strukturieren, um dies zu bilden? Sie sollten -l, -m, -s, -h, home oder work aufrufen können, aber nicht beides. Sie sollten -l oder -m aufrufen, bevor Sie -i verwenden können.Wie sollte ich die Argase strukturieren, um dies zu bilden?

prog home 
prog work 
prog -l -i1 
prog -m -i1 -i2 
prog -s 

Der Code, den ich so etwas zu machen, schrieb:

usage: prog 
      (-l | -m) [-i1][-i2][-i3][-i4] 
      -s 
      -h 
      home 
      work 

kann mit aufgerufen werden.

def get_args(): 
     parser = argparse.ArgumentParser(prog="prog") 
     group = parser.add_mutually_exclusive_group(required=True) 
     group.add_argument('-l', action='store_true', help='List Mode. List available options', default=False, dest='list') 
     group.add_argument('-m', action='store_true', help='Departure Mode. Return a departure time from stopcode or agency and stopname', default=False, dest='mode') 
     group.add_argument('-s', action='store_true', help='Setup Mode. Enter setup mode to make a home and a work list of station codes.', default=False, dest='setup') 
     group.add_argument('home', help='Display HOME_LIST') # this causes it to break because positional arguments cant be required for some reason 
     group.add_argument('work', help='Display WORK_LIST') 
     parser.add_argument('-i1', nargs='?', dest='i1') 
     parser.add_argument('-i2', nargs='?', dest='i1') 
     parser.add_argument('-i3', nargs='?', dest='i1') 
     return parser.parse_args() 
+2

Leider ist Stack Overflow kein Code-Schreibdienst. Wenn Sie eine Lösung finden, die nicht zu funktionieren scheint, helfen wir Ihnen gerne, herauszufinden, was damit nicht stimmt, aber nach dem Code zu fragen, ohne uns zu zeigen, was Sie versucht haben, passt nicht zu den Regeln von Stack Overflow. – zondo

+0

Okay, ich kann meinen schrecklichen Codeversuch hinzufügen – polka

+0

ich muss gehen, ich kann Fragen in einer Stunde beantworten. – polka

Antwort

1

ich das ein bisschen sauber werden:

parser = argparse.ArgumentParser(prog="prog") 

group = parser.add_mutually_exclusive_group(required=True) 

ein, und nur eine der folgenden Aktionen erlaubt ist und erforderlich

group.add_argument('-l', '--list', action='store_true', 
    help='List Mode. List available options') 

für 'store_true' default False ; keine Notwendigkeit, es zu definieren. Geben Sie das 'dest' in dem langen Namen

group.add_argument('-m', '--mode', action='store_true', 
    help='Departure Mode. Return a departure time from stopcode or agency and stopname') 

group.add_argument('-s', '--setup', action='store_true', 
    help='Setup Mode. Enter setup mode to make a home and a work list of station codes.') 

group.add_argument('home',nargs='?', default='unknown', help='Display HOME_LIST') 

Positional Argumente von der Natur erforderlich sind (es sei denn, nargs='?'). Sie passen also nicht in eine wechselseitig required_group. Wie können Sie eines der anderen Argumente liefern und trotzdem diese erforderliche Position liefern?

In einer m_ex_group ist nur eine optionale Position zulässig.

parser.add_argument('work', help='Display WORK_LIST') 

Warum die nargs='?'? Von Natur aus sind sie optional. Wenn sie nicht angegeben werden, erhalten sie den Standardwert. "?" ist nützlich, wenn Sie auch eine const definieren.

parser.add_argument('--i1') 
parser.add_argument('--i2') 
parser.add_argument('--i3') 

return parser.parse_args() 

Sie können die relative Reihenfolge der Positionale angeben. In diesem Fall wird work nach home kommen. Optionale Optionen können jedoch in beliebiger Reihenfolge auftreten. So können diese --i* Argumente überall auftreten. Aber das sollte nicht wichtig sein.

Um -l oder -m zusammen mit --i1 (usw.) zu erfordern, erfordern subparsers. Das heißt, Sie so etwas wie

sp = parser.add_subparsers(dest='mode') 
p0 = sp.add_parser('list') 
p1 = sp.add_parser('mode') 
p2 = sp.add_parser('setup') 

p0.add_argument('--i1') 
p0.add_argument('--i2') 
... 
p1.add_argument('--i1') 
... 

Aber subparsers nicht spielen gut mit anderen positionals definieren werde, vor allem ‚?‘ Einsen.

z.B. argparse optional positional argument and subparsers arguments

+0

Was meinst du mit "schön spielen"? – polka

+1

Strings werden 'Positionals' rein auf der Basis von Ordnung, nicht 'Bedeutung' zugewiesen. 'home work cmd' ist klar,' [home] [work] cmd' ist mehrdeutig. 'home cmd work' könnte auch problematisch sein. – hpaulj

Verwandte Themen