单个短划线用于argparse长选项

时间:2015-06-29 23:48:46

标签: python command-line-interface command-line-arguments argparse

是否可以使用argparse将--longoption表示为-longoption

argparse.prefix_chars不起作用,因为假设前缀char将重复一个长选项。

我想也许有办法可以关闭短选项并允许长选项使用单个破折号而不是双破折号。像这样:

parser = argparse.ArgumentParser()
parser.turn_off_short_opts()

可以这样做吗?如果没有,我可以用什么来实现这个目标?

2 个答案:

答案 0 :(得分:7)

单个破折号长参数不是问题:

In [250]: p=argparse.ArgumentParser()

In [251]: p.add_argument('-longargument')
Out[251]: _StoreAction(option_strings=['-longargument'], dest='longargument', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

In [252]: p.parse_args(['-long','test'])
Out[252]: Namespace(longargument='test')

In [253]: p.parse_args(['-l','test'])
Out[253]: Namespace(longargument='test')

我必须仔细检查代码,但我认为长期和短期期权之间的区别并不重要。创建操作时,所有操作都会添加到option_strings属性中。 long(多字符)字符串用于设置'dest',但您也可以自己设置。

Duffy引用的行为:longoption means a completely different thing: It means -l -o -n -g -p -t -i更加微妙。如果-l-o等都已定义且不需要参数,则将使用解释。但它不会干扰-longoption的常规解释。但是你应该意识到这些解释,并在开发过程中测试事物。

以下是用于为选项设置dest的代码:

    if dest is None:
        if long_option_strings:
            dest_option_string = long_option_strings[0]
        else:
            dest_option_string = option_strings[0]

就在此之前,它将带有--的字符串收集到long_option_string`列表中。但如果没有这样的字符串,它会使用第一个字符串。

In [270]: p.add_argument('-longargument','-l','--longish')
Out[270]: _StoreAction(option_strings=['-longargument', '-l', '--longish'], dest='longish', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

此处使用--longish代替-longargument

查看选项字符串长度的唯一其他地方是-xyz的特殊处理,它专注于单个字符串('-x',' - y',' - z')。 / p>

答案 1 :(得分:1)

感谢@CharlesDuffy的想法。

事先通过sys.argv并用-long-option替换每个--long-option,但请记住拦截解析器的帮助消息。像这样:

parser = argparse.ArgumentParser(add_help=False)
parser.add_argument(('-h', '--help'), help='Show this message and quit', action='count')
# add other args

new_argv = []
for arg in sys.argv:
    if arg.startswith('-') and len(arg) > 2:
        arg = '-' + arg
    new_argv.append(arg)
sys.argv = new_argv

args = parser.parse_args()
if args.help:
    help_string = parser.format_help()
    print(help_string.replace('--', '-'))
    parser.exit(0)