argparse 可以管理多组位置参数吗?

Can argparse manage multiple sets of positional arguments?

我想从命令行处理多组数据的输入,但我不知道该怎么做。我在想有多个可选参数和多个位置参数会起作用,但我不知道该怎么做。

例如,我想获取如下数据:

{
  'id': 23423423
  'host': 'hostname'
  'port': 234
}

我希望能够在命令行输入多组。我该怎么做?

我的想法是有一个像这样的命令行:

python check.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234

我一直在查看 argparse 以了解如何做到这一点,但我不知道如何做到这一点。

可按如下方式进行

import argparse
parser = argparse.ArgumentParser(description='')
parser.add_argument("-d", nargs="+", action='append')

args = parser.parse_args()
print(args.d)

运行 python check.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234 将被解析为列表的列表,如下所示。

[['23423423', 'hostname.com', '234'], ['22332322', 'hostname2.com', '234']]

这感觉可以改进,但您可以定义 _AppendAction 的自定义子类以获取 3 个参数并使用它们构建 dict

import argparse
p = argparse.ArgumentParser()


class Config(argparse._AppendAction):
    def __call__(self, parser, namespace, values, option_string):
        id_ = int(values[0])
        port = int(values[2])
        d = {"id": id_, "host": values[1], "port": port}
        return super().__call__(parser, namespace, d, option_string)

p.add_argument("-d", nargs=3, action=Config, metavar=("ID", "HOST", "PORT"))

print(p.parse_args())

然后

$ python3 tmp.py -d 23423423 hostname.com 234 -d 22332322 hostname2.com 234
Namespace(d=[{'id': '23423423', 'host': 'hostname.com', 'port': 234}, {'id': '22332322', 'host': 'hostname2.com', 'port': 234}])

(我更喜欢

def Config(t):
    return {"id": t[0], "host": t[1], "port": int(t[2])}

p.add_argument("-d", nargs=3, action='append', type=Config)

其中将 3 个参数聚合到一个对象中的行为 与将结果 dict 附加到目的地是分开的, 但是每个单独的参数都单独传递给类型,而不是将三个字符串作为单个元组传递。唉。)