我使用argparse
解析Python脚本中的CLI选项。我会创建一个标志,相当于指定另外两个标志。所以
python myscript.py --flagc
相当于
python myscript.py --flaga --flagb
这是我的代码:
args = parser.parse_args()
if args.flagc:
args.flaga = True
args.flagb = True
问题是flaga
,而flagb
也有相反的标记,no-flaga
和no-flagb
:
parser.add_argument("--flaga", dest="flaga", action="store_true")
parser.add_argument("--no-flaga", dest="flaga", action="store_false")
parser.set_defaults(flaga=False)
等等。所以我可能遇到标志优先级问题。例如,如果我用:
调用脚本python myscript.py --flagc --no-flaga
True
获得args.flaga
,但通常您需要False
,因为上一个标志优先。
我该如何管理?
答案 0 :(得分:0)
是的,通过在解析后处理mapPartitions
,您将丢失优先级信息。通常这个问题支持这种后期处理,但这里的自定义Action可能是更好的选择。
flag_c
打印:
class MyAction(argparse._StoreTrueAction):
def __call__(self, parser, namespace, values, option_string=None):
# adapt from _StoreConst
# leave the self.dest set; could deactivate
setattr(namespace, self.dest, self.const)
setattr(namespace, 'flaga', True)
setattr(namespace, 'flagb', True)
parser.add_argument("--flagc", action=MyAction)
print(parser.parse_args('--flaga'.split()))
print(parser.parse_args('--flagc'.split()))
print(parser.parse_args('--flagc --no-flaga'.split()))
这是完成这项工作的最简单的自定义类。它利用了其父级设置的默认值(特别是1027:~/mypy$ python stack33264649.py
Namespace(flaga=True, flagb=False, flagc=False)
Namespace(flaga=True, flagb=True, flagc=True)
Namespace(flaga=False, flagb=True, flagc=True)
)。或者,它可以基于nargs=0
甚至_StoreConst
。
我离开了Action
。准确指出是否调用setattr(namespace, self.dest, self.const)
对于确定指标并没有什么害处。它比试图压制--flagc
默认值更简单。
好的,压制默认值并不困难:
flagc