Python 从Namspace创建namedtuple?
如何从中初始化 如果只有一些脚本参数进入namedtuple,我该怎么办? 以下是我的想法:Python 从Namspace创建namedtuple?,python,python-2.7,argparse,namedtuple,Python,Python 2.7,Argparse,Namedtuple,如何从中初始化 如果只有一些脚本参数进入namedtuple,我该怎么办? 以下是我的想法: nt_param=nt(**{f:getattr(args,f,None) for f in nt._fields}) 是否有更具python风格的方法?如果您不关心namedtuple的实际类型,那么可以创建一个“匿名”namedtuple来表示您的名称空间 以下是我以前使用过的一种方法: def auto_namedtuple(classname='auto_namedtuple', **kwar
nt_param=nt(**{f:getattr(args,f,None) for f in nt._fields})
是否有更具python风格的方法?如果您不关心namedtuple的实际类型,那么可以创建一个“匿名”namedtuple来表示您的
名称空间
以下是我以前使用过的一种方法:
def auto_namedtuple(classname='auto_namedtuple', **kwargs):
return collections.namedtuple(classname, tuple(kwargs))(**kwargs)
在您的情况下的用法:
nt = auto_namedtuple(**vars(args))
“如果程序的所有参数都在nt中,我可以将namespace=nt()传递给parser.parse_args()。”除非您不能,因为namedtuples是immutable@AnthonySottile:谢谢,已删除。一个小的改进是删除对
getattr
的调用中的None
。由于名称空间
对象已将任何未定义的命令行参数设置为无
,因此您不必自己显式返回无
。-询问如何将命名空间转换为不可变。除了复制到namedtuple
之外,我建议使用一个自定义名称空间
类。我还讨论了中的namedtuple
是namedtype
的可变替代。重要的是namedtuple
只包含特定的字段。您所做的似乎很好,您是否有特定的问题?不是真的,我只是想看看我是否在做傻事。谢谢你的帮助!请注意,虽然\u fields
有一个前导下划线,但它实际上不是“private”属性,stdlib会这样做
nt = auto_namedtuple(**vars(args))