2017-07-24 70 views
3

如何从Namespace初始化namedtuple从Namspace创建namedtuple?

import collections 
import argparse 

nt=collections.namedtuple("nt",["foo","bar"]) # _NOT_ "baz"! 
parser = argparse.ArgumentParser() 
parser.add_argument('--foo') 
parser.add_argument('--bar') 
parser.add_argument('--baz') 
args = parser.parse_args(...) 

如果只一些脚本参数进入namedtuple我该怎么办?

这里是我想出了:

nt_param=nt(**{f:getattr(args,f,None) for f in nt._fields}) 

是有一个更Python的方法呢?

+2

“如果程序的所有参数都在新台币,我可以通过命名空间=新台币( )到parser.parse_args()。“除非你不能,因为namedtuples是**不可变的** –

+0

@AnthonySottile:谢谢,删除。 – sds

+0

一个小改进就是在你调用getattr的时候删除'None'。由于'Namespace'对象已将任何未定义的命令行参数设置为'None',因此您不必自己显式返回'None'。 –

回答

0

如果您不关心namedtuple的实际类型,您可以创建一个代表您的Namespace的“匿名”namedtuple。

这里是我以前使用的方法:

def auto_namedtuple(classname='auto_namedtuple', **kwargs): 
    return collections.namedtuple(classname, tuple(kwargs))(**kwargs) 

使用你的情况:

nt = auto_namedtuple(**vars(args)) 
+0

'namedtuple'只包含特定字段是很重要的。 – sds

+0

你在做什么似乎很好,你有一个特定的*问题*? –

+0

不是,我只是想看看我是否在做一些愚蠢的事情。谢谢你的帮助! – sds