逗号分隔列表的 argparse 操作或类型

Rya*_*ing 15 python argparse python-3.x

我想创建一个可以用作的命令行标志

./prog.py --myarg=abcd,e,fg
Run Code Online (Sandbox Code Playgroud)

并在解析器内部将其转换为['abcd', 'e', 'fg'](元组也可以)。

我已经使用actionand成功地做到了这一点type,但我觉得一个可能是对系统的滥用或遗漏了极端情况,而另一个是正确的。但是,我不知道哪个是哪个。

与action:

import argparse

class SplitArgs(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        setattr(namespace, self.dest, values.split(','))


parser = argparse.ArgumentParser()
parser.add_argument('--myarg', action=SplitArgs)
args = parser.parse_args()
print(args.myarg)
Run Code Online (Sandbox Code Playgroud)

取而代之的是type:

import argparse

def list_str(values):
    return values.split(',')

parser = argparse.ArgumentParser()
parser.add_argument('--myarg', type=list_str)
args = parser.parse_args()
print(args.myarg)
Run Code Online (Sandbox Code Playgroud)

man*_*ndo 11

最简单的解决方案是将您的参数视为字符串并拆分。

#!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--myarg", type=str)
args = parser.parse_args()
if args.myarg is not None:
    args.myarg = [s.strip() for s in args.myarg.split(",")]
print(args)
Run Code Online (Sandbox Code Playgroud)

结果:

$ ./toto.py --myarg=abcd,e,fg
Namespace(myarg=['abcd', 'e', 'fg'])
$ ./toto.py --myarg="abcd, e, fg"
Namespace(myarg=['abcd', 'e', 'fg'])
Run Code Online (Sandbox Code Playgroud)


V13*_*V13 3

我发现你的第一个解决方案是正确的。原因是它允许您更好地处理默认值:

names: List[str] = ['Jane', 'Dave', 'John']

parser = argparse.ArumentParser()
parser.add_argument('--names', default=names, action=SplitArgs)

args = parser.parse_args()
names = args.names
Run Code Online (Sandbox Code Playgroud)

这不适用于 list_str 因为默认值必须是字符串。