argparse 长选项的单破折号

Posted

技术标签:

【中文标题】argparse 长选项的单破折号【英文标题】:Single dash for argparse long options 【发布时间】:2015-09-16 14:32:54 【问题描述】:

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

argparse.prefix_chars 不起作用,因为它假定前缀 char 会在长选项中重复。

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

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

这可以吗?如果没有,我可以使用什么来完成此操作?

【问题讨论】:

-longoption 意味着完全不同的东西:它意味着 -l -o -n -g -p -t -i -- 也就是说,它设置了一个每个字母的标志。使这种用法意味着其他任何事情都会让用户感到非常困惑。 为什么要单破折号长选项? @Falmarri 因为我必须这样做以符合我工作场所的惯例 当然,您可以在将列表传递给 argparse 之前对列表进行调整——将任何单个破折号前缀加倍。 @CharlesDuffy 哦,天哪。太感谢了;不知道为什么我从来没有想过。但是,我该如何获得正确显示的帮助呢? 【参考方案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)

【讨论】:

为了使它更紧凑作为单行: sys.argv = [re.sub(r'^-([^-]+)', '--\g' , x) for x in sys.argv]【参考方案2】:

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

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 属性。长(多字符)字符串用于设置“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')。

【讨论】:

以上是关于argparse 长选项的单破折号的主要内容,如果未能解决你的问题,请参考以下文章

Python argparse:参数中的前导破折号

argparse模块

Python argparse 以不同的方式处理参数

argparse 错误:无法识别选项

argparse - 命令行选项与参数解析

python内置库--argparse