【问题标题】:Python argument parser list of list or tuple of tuplesPython参数解析器列表或元组的元组列表
【发布时间】:2012-04-16 06:11:36
【问题描述】:

我正在尝试使用参数解析器来解析 3D 坐标,以便我可以使用

--cord 1,2,3 2,4,6 3,6,9

得到

((1,2,3),(2,4,6),(3,6,9))

我的尝试是

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--cord', help="Coordinate", dest="cord", type=tuple, nargs=3)
args = parser.parse_args(["--cord","1,2,3","2,4,6","3,6,9"])

vars(args) 
{'cord': [('1', ',', '2', ',', '3'),
  ('2', ',', '4', ',', '6'),
  ('3', ',', '6', ',', '9')]}

逗号的替换是什么?

【问题讨论】:

  • +1 用于展示您的尝试并使用标准库而不是重新发明

标签: python argparse


【解决方案1】:

您可以添加自己的type。这也允许进行额外的验证,例如:

def coords(s):
    try:
        x, y, z = map(int, s.split(','))
        return x, y, z
    except:
        raise argparse.ArgumentTypeError("Coordinates must be x,y,z")


parser.add_argument('--cord', help="Coordinate", dest="cord", type=coords, nargs=3)

【讨论】:

  • +1 谢谢!已将 raise 更改为 TypeError。感谢您的回答!
  • 因为这个case是3D坐标nargs=3是显而易见的,但是如果你的case不需要固定数量的元组,你可以使用nargs='+'
【解决方案2】:

对于我的问题,我必须有一个更通用的方法,而不是与输入的数量挂钩。

从georg的精彩回答开始,我解决了我的问题如下

# additional type
def coords(s):
    seps = r'[ ;.]'
    try:
        situp = []
        for si in re.split(seps, s):
            situp.append(tuple(map(int, si.split(','))))
        return situp
    except:
        raise argparse.ArgumentTypeError("Coordinates must be given divided by commas and space, dot, or semicolon e.g.: 'x,y k,l,m'")

这样,1,2 3,4,5 之类的输入将转换为[(1,2), (3,4,5)] 之类的元组列表

编辑:可能是for循环不是最优的,但我写它是为了避免使用nargs

编辑 2:

  1. 要有一个列表,一个应该改变

    一行situp.append(tuple(map(int, si.split(','))))

    situp.append(list(map(int, si.split(','))))

  2. 有一个 uples 的元组可以改变返回值

    return tuple(situp)

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2017-09-06
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    相关资源
    最近更新 更多