当前位置: 首页 > 知识库问答 >
问题:

将可选列表传递给argparse

轩辕欣可
2023-03-14

有没有比传递分隔字符串并稍后解析它更优雅的方法来传递可选的整数列表到Argparse?我也有一个位置论点。

parser.add_argument('--ids', type=int, nargs='+')
parser.add_argument('cmd')

不工作,因为artparse试图获取cmd并抱怨它不是整数。

理想情况下,我想与其中一个执行

program.py --ids 6,32,12 refresh
program.py --ids 6 32 12 refresh

或者类似的东西,但也能

program.py refresh

共有2个答案

祁英哲
2023-03-14

如果您只想解析形式为--ids1,2,3(无空格)的参数,可以使用如下方法:

def convert(argument):
    return map(int, argument.split(','))  # 3.x: consider wrapping in list()

parser.add_argument('--ids', type=convert)

这不会处理由空白分隔的参数,尽管您可能可以通过更智能的转换()函数来减轻这种情况。然而,您需要引用它们,否则shell会将它们作为单独的参数传递。

高化
2023-03-14

--是一种表示“位置参数从这里开始”的简便方法。

使用您的解析器,可以执行以下操作:

program.py refresh   # sets ids=None
program.py refresh --ids 1 2 3
program.py --ids 1 2 3 -- refresh

如果不喜欢None,可以为--ids参数指定一个默认值(例如[])。

任何与program.pyreesh--id 1,2,3有关的问题都是由于shell如何分割命令行造成的。查看sys.argv列表。

出现program.py--id 1 2 3刷新的问题是因为在处理--id时,解析器尝试使用所有不明显标志的字符串(例如'-')。它不使用int类型来测试使用哪些类型和离开哪些类型。

现在,如果id是定位的,那么它将处理123refresh

parser.add_argument('ids',type=int,nargs='+')
parser.add_argument('cmd')
parser.parse_args('1 2 3 refresh'.split())

但这是因为解析器使用不同的策略将字符串分配给几个位置参数。它使用一个类似于A的匹配器。

Kevin的type方法可以通过一个简单的函数更好地实现:

def mytype(astring):
    ll = astring.split(',')
    return [int(l) for l in ll]
parser.add_argument('--ids', type=mytype)

它可以推广到处理带引号的字符串,如“1 2 3”type可以是任何接受字符串并返回所需值的函数,如果无法进行转换,则会引发错误。

 类似资料:
  • 问题内容: 我想按值将列表传递给函数。默认情况下,列表和其他复杂对象通过引用传递给函数。这是一些目标: 可以写得短些吗?换句话说,我不想更改 ad 。 问题答案: 您可以使用,但是对于包含列表(或其他可变对象)的列表,您应该使用: 等价于或,并返回列表的浅表副本。 何时使用:

  • 问题内容: 我正在尝试从SQL导出到.csv,如果我对其进行硬编码以接受一定数量的参数,则它可以正常工作。问题是,我想允许用户请求任意数量的参数,并将它们传递给where子句。该代码应该使这一点更加清楚。 所以我想我要做的是将列表传递给where子句,而不是显式的:dates#变量。例如,一个人可以使用参数“ 2012-01-0412:00、2012-02-04 12:00、2012-03-04

  • 例如,在具有分页列表的路由上,网址可能如下所示,表示我们已加载第二个网页: 使用指令和来传递查询参数。例如: 或者,我们可以使用服务通过JS跳转: 读取查询参数 See Official Documentation on Query Parameters

  • 问题内容: 当提供一些参数时,我想使我的python脚本从命令行运行。但是,参数之一应该是特定于脚本一个片段的选项列表。字符串解析是在逗号分隔“命令行列表”字符串之后实际构造列表的唯一方法吗?如果是这样,您将如何处理? 示例:-details = [‘name’,’title’,’address’] 问题答案: 程序: 命令行: 输出: 此代码段将执行短或长命令切换(例如或),并在切换到Pytho

  • 我正试图添加一个新列到spark dataframe中,如下所示: 我试图将上面的列值列表作为新列传递给dataframe,并尝试对该新列执行sha2,并尝试执行varchar(64)。

  • 我正在尝试在更改选项后将我的Thymeleaf超文本标记语言中已经提供的List传回控制器。我尝试过隐藏输入,但不幸的是,它还不起作用。 我的表单如下所示(控制器已经提供了“电影”列表) 我的控制器看起来像这样: 期待有人能帮助我!