Python argparse 切换标记

9
在argparse中有没有一种方法可以解析像[+-]a,b,c,d这样的标志?
foo.py +s -b

应该将True存储在s的dest中,将False存储在b的dest中,就像Windows的attrib或Linux的chmod一样。目前,我正在使用两个单独的参数+s和-s,分别带有store_true和store_false。但这会创建一个丑陋的帮助,其中每个标志都会列出两次(+a和-a)。另一种解决方法是手动使用正则表达式解析扩展参数(这似乎要容易得多),并使用自定义描述。但在这样做之前,我想看看是否有任何可以使用argparse本身执行相同操作的方法。
1个回答

6
您可以通过将-s+s同时传递给一个add_argument调用,并使用自定义操作来实现此目的:
class ToggleAction(argparse.Action):
    def __call__(self, parser, ns, values, option):
        setattr(ns, self.dest, bool("-+".index(option[0])))
ap = ArgumentParser(prefix_chars='-+')
ap.add_argument('-s', '+s', action=ToggleAction, nargs=0)

ap.parse_args(['+s'])
Namespace(s=True)

ap.parse_args(['-s'])
Namespace(s=False)

太好了,我以为action会是关键,但是忽略了定义一个Action类。 - nbaztec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接