从Namspace创建namedtuple?
问题描述:
如何从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的方法呢?
答
如果您不关心namedtuple的实际类型,您可以创建一个代表您的Namespace
的“匿名”namedtuple。
这里是我以前使用的方法:
def auto_namedtuple(classname='auto_namedtuple', **kwargs):
return collections.namedtuple(classname, tuple(kwargs))(**kwargs)
使用你的情况:
nt = auto_namedtuple(**vars(args))
“如果程序的所有参数都在新台币,我可以通过命名空间=新台币( )到parser.parse_args()。“除非你不能,因为namedtuples是**不可变的** –
@AnthonySottile:谢谢,删除。 – sds
一个小改进就是在你调用getattr的时候删除'None'。由于'Namespace'对象已将任何未定义的命令行参数设置为'None',因此您不必自己显式返回'None'。 –