【发布时间】:2017-07-24 16:54:24
【问题描述】:
如何从Namespace 初始化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})
有没有更 Pythonic 的方法?
【问题讨论】:
-
"如果程序的所有参数都在 nt 中,我可以将 namespace=nt() 传递给 parser.parse_args()。"除非你不能,因为命名元组是不可变的
-
@AnthonySottile:谢谢,已删除。
-
一个小的改进是删除您对
getattr的调用中的None。由于Namespace对象已经将任何未定义的命令行参数设置为None,因此您不必自己显式返回None。 -
stackoverflow.com/questions/34348568/… - 询问将命名空间转换为不可变的。除了复制到
namedtuple之外,我建议使用自定义Namespace类。我也在stackoverflow.com/questions/42279063/…中讨论namedtuple -
pypi.python.org/pypi/recordtype 是
namedtype的可变替代品。
标签: python python-2.7 argparse namedtuple