2016-04-28 83 views
0

我應該如何構建這個概念來形成這個?你應該可以調用-l,-m,-s,-h,家庭或工作,但不能同時使用兩者。在使用任何-i之前,您必須先調用-l或-m。我應該如何構建這個argparse來形成這個?

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

可以用被稱爲:

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

我寫做類似的東西的代碼。

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

不幸的是,堆棧溢出不是一個代碼寫入服務。如果您想出的解決方案看起來不起作用,我們很樂意幫助您找出問題所在,但在不向我們展示您所嘗試的內容的情況下詢問代碼並不適合Stack Overflow的規則。 – zondo

+0

好吧,我可以添加我的可怕代碼嘗試 – polka

+0

我必須去,我可以在一個小時內回答問題。 – polka

回答

1

我會有點打掃一下:被允許和要求的

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

以下

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

group = parser.add_mutually_exclusive_group(required=True) 

一個,只有一個, 'store_true' 默認值爲False ;不需要定義它。給在長名稱「DEST」

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') 

位置參數是由性質所要求的(除非nargs='?')。所以他們不適合互用組。你怎麼能提供其他論點之一,並仍然提供這個所需的位置?

m_ex_group中只允許有一個可選位置。

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

爲什麼nargs='?'?本質上它們是可選的。所以他們會得到默認值,如果沒有給出。 '?'如果您還定義const,則此功能非常有用。

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

return parser.parse_args() 

您可以指定位置的相對順序。在這種情況下,work將會在home之後出現。但是可選項可以以任何順序發生。所以這些--i*參數可以發生在任何地方。但那不應該。

要求要求-l-m以及--i1(等),將需要subparsers。也就是說,你會這樣定義

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') 
... 

subparsers東西不與其他positionals發揮很好,尤其是「?」那些。

例如argparse optional positional argument and subparsers arguments

+0

你的意思是「好好玩」? – polka

+1

字符串純粹基於順序而不是「含義」分配給「位置」。 「家庭工作cmd」很清楚,「[家庭] [工作] cmd」不明確。 「家裏的工作」也可能有問題。 – hpaulj