使用parser_args值来提供for循环(Python 3.6)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用parser_args值来提供for循环(Python 3.6)相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个脚本,它接受相同类型的多个命令行参数,然后将它们提供给for循环进行处理,下面是我在我的代码中的内容:

import argparse

parser = argparse.ArgumentParser(description='XYZ')
parser.add_argument('[values]', nargs='+', help='A list of values')

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])

for values in u:
    ... # do a bunch of stuff for each "value"

我知道存储在parse_args中的值是一个NAMESPACE,因此当我运行我的代码时出现以下错误:

TypeError: 'Namespace' object is not iterable

有没有办法将它们变成列表对象?所以我可以将它们传递给我的for循环,或者我应该使用其他方法吗?刚刚开始使用python,如果这是一个noob问题,请提前道歉

答案

你需要迭代u.values(你在add_argument调用中指定的参数名称)而不是u本身;要做到这一点,你需要将[values]重命名为values

import argparse

parser = argparse.ArgumentParser(description='XYZ')
parser.add_argument('values', nargs='+', help='A list of values')
#                   ^^^^^^^^

u = parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])

for value in u.values:
    #        ^^^^^^^^
    # do a bunch of stuff for each "value"
另一答案

解析的值是argparse.namespace类的简单对象(可以自定义 - 参见文档)。

通常您可以按属性名称访问这些值,例如args.foo。对于不寻常的名字,你很多人必须使用getattr(args, '[values]')

在简单的情况下,参数值是单个字符串或数字。使用像'*'或'+'这样的nargs,值将在列表中。使用append动作类型,您甚至可以获得列表中的列表。

我鼓励用户打印args命名空间。

In [2]: parser = argparse.ArgumentParser(description='XYZ')
   ...: parser.add_argument('[values]', nargs='+', help='A list of values')....
In [3]: args =parser.parse_args(['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])

In [4]: print(args)
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])

使用'dest',我必须使用getattrargs获取字符串列表。

In [5]: getattr(args,'[values]')
Out[5]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']

args是一个简单的对象,因此您可以添加属性或修改现有属性。例如

In [6]: args.values = ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']
In [7]: print(args)
Namespace([values]=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'], 
    values=['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q'])

如果您对字典更熟悉,可以使用vars()

In [9]: vars(args)['values']
Out[9]: ['3crlV5QaiuUjRz5kWze', 'F9Xw0rggHZ_PLs62q']

玩这种互动的Python会话。

以上是关于使用parser_args值来提供for循环(Python 3.6)的主要内容,如果未能解决你的问题,请参考以下文章

无法在我的 for 循环中使用 add_roles discord.py 重写

SQL 游标 FOR 循环,模式名称中带有 / 变量

21 22 py中的while for循环

向量化

Vue v-for 循环 - 过滤数组时如何定位组件

《Linux命令行与shell脚本编程大全》第十三章 更多的结构化命令