2017-05-10 70 views
1

相反有一堆散落在調用文字來add_argument,像這樣的:我可以傳遞一個對象到argparse.add_argument嗎?

parser.add_argument('--foo', 
        required=False, 
        metavar='bar', 
        type=str, 
        help='help message', 
        default='default') 

parser.add_argument('--foo2', 
        required=False, 
        metavar='bar2', 
        type=str, 
        help='help message', 
        default='default') 

我希望我可以先創建一個容器,然後添加所有參數的循環。
事情是這樣的:

for arg in argument_container: 
    parser.add_argument(arg) 

我不熟悉不夠用Python是如何接受這些參數,以瞭解他們是否可以被抽象到某種對象字面像我想要的。

有沒有辦法將所有參數先抽象出來放入一個容器,然後通過一個循環一次添加所有參數,如上所示?

+0

你試過嗎? – JohanL

+0

我試過在字典中傳遞,那是行不通的。我試圖創建一種對象字面值作爲一個命名的元組,這是行不通的。我查看了add_argument的實現,但我仍然不確定可以接受的函數。 –

回答

1

許多add_argument參數是關鍵字1,可以通過**kwargs語法傳入。例如:

In [90]: parser=argparse.ArgumentParser() 
In [91]: adict={"metavar":"bar", "help":"help message", "default":"default"} 
In [92]: a1 = parser.add_argument('--foo', **adict) 
In [93]: a1 
Out[93]: _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default='default', type=None, choices=None, help='help message', metavar='bar') 

In [94]: parser.print_help() 
usage: ipython3 [-h] [--foo bar] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo bar help message 

在這裏,我創建了一個小字典,一些參數,並通過**adict通過那些英寸

我沒有在該字典中包含'--foo',因爲它是位置參數。這仍然可以分配給一個變量,並以這種方式傳遞。

我保存了由add_argument返回的對象的引用,並將其顯示出來。它顯示了大部分參數如何成爲生成的Action對象的屬性。


對於你的第二個論點:

In [95]: dest = "--foo2" 
In [96]: adict={"metavar":"bar2", "help":"help message2", "default":"default2"} 
In [97]: a2 = parser.add_argument(dest, **adict) 
In [98]: 
In [98]: parser.print_help() 
usage: ipython3 [-h] [--foo bar] [--foo2 bar2] 

optional arguments: 
    -h, --help show this help message and exit 
    --foo bar help message 
    --foo2 bar2 help message2 

顯然,這可以推廣使用詞典列表工作,或者需要一些參數,生成失蹤者,並以這種方式調用add_argument的功能。

+0

謝謝。通過時,我並不是字典。 –

2

兩者都要在同一個列表中的*args**kwargs,您可以將其添加爲一個元組的部分:

import argparse 

parser = argparse.ArgumentParser(description='Process some strings.') 

args = [(('--foo', '-f'), {'help':'Foo help', 'required':False, 'type':str, 'default':'foo'}), 
     (('--bar', '-b'), {'help':'Bar help', 'required':False, 'type':str, 'default':'bar'})] 

for arg in args: 
    parser.add_argument(*arg[0], **arg[1]) 

parsed_args = parser.parse_args() 

因此,元組的第一部分是另外一個元組,包含的不同名稱參數,那麼(外部)元組的第二部分是帶關鍵字參數的字典。

相關問題