检查此结尾以获取基于 store_const 的解决方案。
我记得看到一个旧的 python 错误问题,它建议用一些可以自动处理 --foo 和 --no-foo 的代码扩展 argparse,也许还有其他一些变体。也许我以后会找到。
但目前argparse 没有符合您要求的机制。
nargs='?' 与 const 和 default 旨在处理像您这样的 3 折盒。
# no --foo, assign the 'default'
--foo # without arg, assign the 'const'
--foo arg # assign the supplied string
虽然语法并不完全符合您的要求,但我认为它为您的用户提供了相同的控制权。
为了更接近您想要的语法,您必须同时创建 logfile 参数和 no-log 参数,然后使用简单的 pos-parsing 测试将两者“合并”。
parser.add_argument('--log-file', ....)
parser.add_argument('--no-log', action='store_true')
及以后:
if args.no_log:
args.log_file = None
如果您必须创建许多这样的参数对,您可以定义一个辅助函数:
def make_inverse_arg(parser, *args, **kwargs):
parser.add_argument(*args, **kwargs)
# define inverse
arg1 = '--no-'+args[1][2:]
parser.add_argument(arg1, action='store_true')
# could be more robust, but you get the idea
def post_test():
...
return post_test
如果--no-foo 被定义为'store_const' 参数,const=None 和--foo 相同的dest,那么它只会在None 存在时将它放在命名空间中。 default=SUPPRESS 确保它不会将自己的默认值放入命名空间。
parser=argparse.ArgumentParser()
parser.add_argument('--no-foo', dest='foo', action='store_const', const=None,
default=argparse.SUPPRESS)
parser.add_argument('--foo',default='test')
In [329]: parser.parse_args([])
Out[329]: Namespace(foo='test')
In [330]: parser.parse_args('--foo xxx'.split())
Out[330]: Namespace(foo='xxx')
In [331]: parser.parse_args('--foo xxx --no-foo'.split())
Out[331]: Namespace(foo=None)
In [332]: parser.parse_args('--no-foo --foo xxx'.split())
Out[332]: Namespace(foo='xxx')
In [333]: parser.parse_args('--no-foo'.split())
Out[333]: Namespace(foo=None)
如果有冲突,--foo 和 --no-foo 中的最后一个确定命名空间中的内容。