如何迭代参数

use*_*650 45 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)
Run Code Online (Sandbox Code Playgroud)

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

TypeError: 'Namespace' object is not iterable
Run Code Online (Sandbox Code Playgroud)

如何迭代参数及其值?

Jam*_*pam 71

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

 for arg in vars(args):
     print arg, getattr(args, arg)
Run Code Online (Sandbox Code Playgroud)

  • 在 Python 3 中: for arg in vars(args): print(arg, getattr(args, arg)) (3认同)

Chr*_*cca 19

Namespace 对象不可迭代,如果您想要字典,标准文档建议执行以下操作:

>>> vars(args)
{'foo': 'BAR'}
Run Code Online (Sandbox Code Playgroud)

所以

for key,value in vars(args).iteritems():
    # do stuff
Run Code Online (Sandbox Code Playgroud)

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

  • 一个典型的用法是实现“调试输入”模式,其中脚本打印出所有输入参数并退出;对于确保日期时间输入值得到正确解释等有用 (3认同)
  • 注意,Python 2.x中的`iteritems()`,Python 3.x中的`items()`。 (3认同)

hpa*_*ulj 8

args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)

要显示参数,请使用:

print args # or print(args) in python3
Run Code Online (Sandbox Code Playgroud)

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

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

vars(args)
Run Code Online (Sandbox Code Playgroud)

将命名空间转换为字典,您可以使用所有字典方法访问该字典.这是拼写出来的docs.

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