元组的元组作为argparse命令行参数

时间:2018-08-06 13:19:35

标签: python

我需要用户提供数字列表作为命令行参数。

我正在采用的当前解决方案在下面,问题是是否有更Python化或更标准的方式来实现。

目前,我正在命令行中接受逗号分隔的空格分隔数字列表,如下所示:

$ python foo.py --numbers '1 2 3, 4 5 6'

我在内部做

def list_of_lists(arg):
    return map(lambda l: map(float, l), map(str.split, a.split(',')))

parser.add_argument('--numbers', type=list_of_lists)

将字符串"1 2 3, 4 5 6"转换为[[1,2,3],[4,5,6]]

2 个答案:

答案 0 :(得分:2)

您所拥有的很好。如果要编写它,我将使用逗号和分号作为分隔符(对此严格要求:不允许使用空格),并使用列表推导进行解析:

def list_of_lists(arg):
    return [float(x.split(',')) for x in arg.split(';')]

但这真的只是装饰。

下一个问题是:您想在list_of_lists中进行多少次验证?现在,这个简单的版本假定字符串的格式与您想要的格式完全相同。您可以添加更多逻辑来捕获错误,并提高argparse.ArgumentTypeError来表示错误的值。

答案 1 :(得分:0)

尝试action="append"并多次使用--numbers

  

这将存储一个列表,并将每个参数值附加到列表中。这对于允许多次指定选项很有用。

import argparse

def to_list(arg):
    return [int(i) for i in arg.split(",")]

parser = argparse.ArgumentParser()
parser.add_argument("--numbers", action="append", type=to_list)
parsed = parser.parse_args("--numbers 1,2,3 --numbers 4,5,6".split())
print(parsed)

输出:

Namespace(numbers=[[1, 2, 3], [4, 5, 6]])