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

新手上路,请多包涵

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

./prog.py --myarg=abcd,e,fg

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

我已经使用 actiontype 成功地完成了这项工作,但我觉得其中一个可能是滥用系统或缺少角落案例,而另一个是正确的。但是,我不知道哪个是哪个。

随着 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)

取而代之的是 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)

原文由 Ryan Haining 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 846
2 个回答

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

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

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

args = parser.parse_args()
names = args.names

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

原文由 V13 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 #!/usr/bin/env python3

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--myarg", type=str)
d = vars(parser.parse_args())
if "myarg" in d.keys():
    d["myarg"] = [s.strip() for s in d["myarg"].split(",")]
print(d)

结果:

 $ ./toto.py --myarg=abcd,e,fg
{'myarg': ['abcd', 'e', 'fg']}
$ ./toto.py --myarg="abcd, e, fg"
{'myarg': ['abcd', 'e', 'fg']}

原文由 mando 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题