为啥 ArgumentParser 返回命名空间而不是字典? [关闭]

Posted

技术标签:

【中文标题】为啥 ArgumentParser 返回命名空间而不是字典? [关闭]【英文标题】:Why does ArgumentParser return a namespace instead of a dictionary? [closed]为什么 ArgumentParser 返回命名空间而不是字典? [关闭] 【发布时间】:2018-08-15 21:13:17 【问题描述】:

是什么让命名空间比字典更理想。仅仅是因为访问像foo.bar 这样的值看起来比foo['bar'] 更好吗?不可能。我觉得我一定是错过了什么。

【问题讨论】:

你可以使用:vars(parser.parse_args(...)) 您询问的是argparse 模块的作者所做的设计决策。不太可能有客观的答案。 作为一个字典,你实际上得到了什么? @chepner 我不同意。我怀疑比我更了解 Python 的人可以对此做出非常有根据的猜测(就像你所做的那样) optparse.Values 类是类似的,一个简单的类,可以用setattr 修改(并用getattr 读取)。这种方法最大限度地减少了关于可以在对象中存储什么以及以什么名称存储的假设。 【参考方案1】:

我怀疑原因是灵活性。支持属性分配的类比需要__getitem____setitem__ 的类更通用。

注意argparse.Namespace只是parse_args返回值的默认类;您可以通过 namespace 关键字参数提供自己的。

p = ArgumentParser()
# add options

class MyNamespace:
    pass

class MyDictNamespace:
    # Provide __getitem__ and __setitem__ wrappers around getattr and setattr
    ...

p1 = p.parse_args()  # Use the default Namespace class
p2 = p.parse_args(namespace=MyNamespace)
p3 = p.parse_args(namespace=MyDictNamespace)

【讨论】:

以上是关于为啥 ArgumentParser 返回命名空间而不是字典? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用其他命名空间/字典更新 argparse 命名空间

访问命名空间

为啥当 javascript 命名空间我们说 var myName = myName || [复制]

使用 Python Etree 解析 XML 并返回指定的标签而不考虑命名空间

c#用foreach遍历数组、列表时是直接获得数据元素,而foreach哈希表时,为啥获得的是命名空间名??

为啥内联未命名的命名空间?