【问题标题】:How to create argument of type "list of pairs" with argparse?如何使用 argparse 创建“对列表”类型的参数?
【发布时间】:2021-11-14 09:56:08
【问题描述】:

我需要让我的 python 脚本的最终用户键入如下内容:

script.py -sizes <2,2> <3,3> <6,6>

-sizes 选项的每个元素都是一对两个正整数。我如何使用argparse 实现这一目标?

【问题讨论】:

  • 输入到底是&lt;2,2&gt; &lt;3,3&gt;还是2,2 3,3 4,4
  • @idjaw 输入没有规范。我只需要让用户输入由两个整数(x 和 y 维度)组成的大小
  • nargs=2action='append' 让你解析'--s 2 2 -s 3 3 -s 6 6'。

标签: python argparse


【解决方案1】:

定义自定义类型:

def pair(arg):
    # For simplity, assume arg is a pair of integers
    # separated by a comma. If you want to do more
    # validation, raise argparse.ArgumentError if you
    # encounter a problem.
    return [int(x) for x in arg.split(',')]

然后将其用作常规参数的类型:

p.add_argument('--sizes', type=pair, nargs='+')

然后

>>> p.parse_args('--sizes 1,3 4,6'.split())
Namespace(sizes=[[1, 3], [4, 6]])

【讨论】:

  • 但要注意'--sizes 1, 3 4, 6'。 shell 将拆分这些对。
  • 我把它放在用户错误的类别中;正确使用 --sizes 的定义要求参数正确。
【解决方案2】:

Argparse 不会尝试涵盖所有可能的输入数据格式。您始终可以将sizes 作为字符串并用几行代码解析它们:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--sizes', nargs='+')

args = parser.parse_args()

try:
    sizes = [tuple(map(int, s.split(',', maxsplit=1))) for s in args.sizes]
except Exception:
    print('sizes cannot be parsed')

print(sizes)

“特殊情况不足以打破规则。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多