只测试默认值集,比如default默认值None:
if args.b is None:
# -b was not used
这不适用于-a,因为store_true 意味着默认False。你可以告诉argparse 使用None 作为默认值:
parser.add_argument('-a', action="store_true", default=None)
但由于您不能使用-a 并且not args.a 为真,您仍然可以测试那个默认值:
parser.add_argument('-a', action="store_true")
args = parser.parse_args()
if not args.a:
# -a was not used
如果None 是一个有效的选择(例如,您使用action="store_const", const=None),则使用不同的哨兵作为默认值:
_sentinel = object()
parser.add_argument('-d', action="store_const",
const=None, default=_sentinel)
args = parser.parse_args()
if args.d is _sentinel():
# -d was not used
您还可以通过将默认值设置为argparse.SUPPRESS 来防止设置默认值全部:
parser.add_argument('-e', default=argparse.SUPPRESS)
args = parser.parse_args()
if not hasattr(args, 'e'):
# -e was not used
您可以通过循环parser._optionals._actions 并查看它们的.dest 属性是否存在并且未设置为.default 值来列出实际使用的所有可选操作:
used_options = [
action for action in parser._optionals._actions
if getattr(args, action.dest, action.default) is not action.default]
演示:
>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-a', action="store_true", default=False)
_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('-b', action="store", dest="b")
_StoreAction(option_strings=['-b'], dest='b', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
>>> parser.add_argument('-c', action="store", dest="c", type=int)
_StoreAction(option_strings=['-c'], dest='c', nargs=None, const=None, default=None, type=<type 'int'>, choices=None, help=None, metavar=None)
>>> def list_used_options(parser, args):
... return [
... action for action in parser._optionals._actions
... if getattr(args, action.dest, action.default) is not action.default]
...
>>> args = parser.parse_args(['-a'])
>>> list_used_options(parser, args)
[_StoreTrueAction(option_strings=['-a'], dest='a', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)]
这只是与sys.argv[1:] 已经告诉你的内容相呼应,当然。