如何迭代参数

时间:2014-11-28 02:28:34

标签: python argparse

我有这样的剧本:

import argparse

parser = argparse.ArgumentParser(
                description='Text file conversion.'
                )
parser.add_argument("inputfile",   help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
                    help="output name")
parser.add_argument("-t", "--type", default="detailed",
                    help="Type of processing")

args = parser.parse_args()

for arg in args:
    print(arg)

但它不起作用。我收到错误:

TypeError: 'Namespace' object is not iterable

如何迭代参数及其值?

7 个答案:

答案 0 :(得分:64)

请添加' vars'如果你想迭代命名空间对象:

 for arg in vars(args):
     print arg, getattr(args, arg)

答案 1 :(得分:19)

Namespace个对象不可迭代,标准文档建议您在需要字典时执行以下操作:

>>> vars(args)
{'foo': 'BAR'}

所以

for key,value in vars(args).iteritems():
    # do stuff

说实话,我不确定你为什么要迭代这些参数。这有点违背了拥有参数解析器的目的。

答案 2 :(得分:7)

args = parser.parse_args()

要显示参数,请使用:

print args # or print(args) in python3

args对象(类型argparse.Namespace)不可迭代(即不是列表),但它有一个.__str__方法,可以很好地显示这些值。

args.outargs.type给出您定义的2个参数的值。这大部分时间都有效。 getattr(args, key)访问值的最常用方法,但通常不需要。

vars(args)

将命名空间转换为字典,您可以使用所有字典方法访问该字典。这是在docs

中详细说明的

参考:文档的命名空间段落 - https://docs.python.org/2/library/argparse.html#the-namespace-object

答案 3 :(得分:2)

我使用args.__dict__,它允许您访问底层的dict结构。 然后,它是一个简单的键值迭代:

for k in args.__dict__:
  print k, args.__dict__[k]

答案 4 :(得分:1)

从解析器中解析_actions似乎是一个不错的主意。而不是运行parse_args()然后尝试从命名空间中挑选东西。

import argparse

parser = argparse.ArgumentParser(
                description='Text file conversion.')
parser.add_argument("inputfile", help="file to process", type=str)
parser.add_argument("-o", "--out", default="output.txt",
                help="output name")
parser.add_argument("-t", "--type", default="detailed",
                help="Type of processing")
options = parser._actions
for k in options:
    print(getattr(k, 'dest'), getattr(k, 'default'))  

您可以将'dest'部分修改为'choices',例如,如果您需要另一个脚本中参数的预设默认值(例如,通过返回函数中的选项)。

答案 5 :(得分:0)

ArgumentParser.parse_args返回Namespace个对象而不是可迭代的数组。

供您参考,https://docs.python.org/3/library/argparse.html#parsing-arguments

ArgumentParser parses arguments through the parse_args() method. This will inspect the command line, convert each argument to the appropriate type and then invoke the appropriate action.

并不应该像那样使用它。考虑一下您的用例,在文档中,它说 argparse将弄清楚如何解析sys.argv中的那些。,这意味着您不必迭代超过这些论点。

答案 6 :(得分:0)

使用内置的 dict() 类迭代 args 很简单,而且效果很好:

args = parser.parse_args()
args_dict = dict(vars(args))
for i, ii in args_dict.items():
     print(i, ii)

来自builtins.py

    def __init__(self, seq=None, **kwargs): # known special case of dict.__init__
        """
        dict() -> new empty dictionary
        dict(mapping) -> new dictionary initialized from a mapping object's
            (key, value) pairs
        dict(iterable) -> new dictionary initialized as if via:
            d = {}
            for k, v in iterable:
                d[k] = v
        dict(**kwargs) -> new dictionary initialized with the name=value pairs
            in the keyword argument list.  For example:  dict(one=1, two=2)
        # (copied from class doc)
        """
        pass