2013-03-01 97 views
2

比方說,在使用argparse解析我的命令行後,我有一個args命名空間。現在,我想用這個來創建這樣一些對象:使用argparse參數作爲關鍵字參數

foo = Foo(bar=args.bar) 

不幸的是,我有如果關鍵字參數設置的限制,它不能是None。現在,我需要檢查,如果args.bar設置並採取相應的行動:

if args.bar: 
    foo = Foo(bar=args.bar) 
else: 
    foo = Foo() 

這是笨重且不能擴展爲多個參數。我想吃點什麼,是這樣的:

foo = Foo(**args.__dict__) 

但仍從我最初的問題的困擾,另外對於不屬於__init__方法的關鍵字參數鍵不起作用。有沒有一個很好的方法來實現這些東西?

回答

2

你可以嘗試這樣的事:

>>> defined_args = {k:v for k,v in args._get_kwargs() if v is not None} 
>>> foo = Foo(**defined_args) 

例如:

>>> import argparse 
>>> args = argparse.Namespace(key1=None,key2='value') 
>>> {k:v for k,v in args._get_kwargs() if v is not None} 
{'key2': 'value'} 

但是請注意,這_get_kwargs()不是公共API的一部分,因此可能會或可能不會在將來提供發佈/版本。

+0

什麼args._get_kwargs'和'ARGS .__ dict__''之間的區別? – mgilson 2013-03-01 15:47:10

+0

@mgilson - 你讓我檢查:沒有真正的:)'def _get_kwargs(self): return sorted(self .__ dict __。items())''。但是,我猜想如果模塊維護者曾向'_AttributeHolder'添加非關鍵字屬性,'Namespace'的基類,他/她/他們可能會將它們從'_get_kwargs'中排除。 – isedev 2013-03-01 15:48:39

+0

在這種情況下,也許你應該使用'args .__ dict __。items()'。 'args .__ dict__'被保證存在(因爲'Namespace'沒有辦法知道它會提前有什麼參數,所以它不能實現'__slots__',據我所知)。而且,我想,如果你真的是偏執狂,你可以繼承'Namespace'並將其傳遞給'parse_args'。 – mgilson 2013-03-01 15:51:52

1

我認爲你可以使用vars()

args = parser.parse_args() 
Foo(**vars(args)) 

瓦爾([對象])返回名稱空間作爲字典