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
附加到目的地是分开的,
但是每个单独的参数都单独传递给类型,而不是将三个字符串作为单个元组传递。唉。)
我想从命令行处理多组数据的输入,但我不知道该怎么做。我在想有多个可选参数和多个位置参数会起作用,但我不知道该怎么做。
例如,我想获取如下数据:
{
'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
附加到目的地是分开的,
但是每个单独的参数都单独传递给类型,而不是将三个字符串作为单个元组传递。唉。)