我需要用户提供数字列表作为命令行参数。
我正在采用的当前解决方案在下面,问题是是否有更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]]
。
答案 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]])