我有这样的剧本:
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
如何迭代参数及其值?
答案 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.out
和args.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