【问题标题】:Create namedtuple from Namspace?从命名空间创建命名元组?
【发布时间】: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/recordtypenamedtype 的可变替代品。

标签: python python-2.7 argparse namedtuple


【解决方案1】:

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

这是我以前使用过的一种方法:

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

在您的情况下的用法:

nt = auto_namedtuple(**vars(args))

【讨论】:

  • 重要的是namedtuple 只包含特定字段。
  • 你在做什么似乎很好,你有一个特定的问题吗?
  • 不是真的,我只是想看看我是否在做一些愚蠢的事情。感谢您的帮助!
  • 请注意,虽然_fields 有一个前导下划线,但它实际上不是“私有”属性,stdlib 这样做to avoid conflicting with user namespaces
猜你喜欢
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多