argparse 长选项的单破折号
Single dash for argparse long options
是否可以使用 argparse 将 --longoption
表示为 -longoption
?
argparse.prefix_chars
不起作用,因为假定长选项会重复前缀字符。
我在想也许有一种方法可以关闭短选项并允许长选项使用单破折号而不是双破折号。像这样:
parser = argparse.ArgumentParser()
parser.turn_off_short_opts()
这能做到吗?如果没有,我可以用什么来完成这个?
感谢 的想法。
只需预先检查 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)
单破折号长参数不是问题:
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 将 --longoption
表示为 -longoption
?
argparse.prefix_chars
不起作用,因为假定长选项会重复前缀字符。
我在想也许有一种方法可以关闭短选项并允许长选项使用单破折号而不是双破折号。像这样:
parser = argparse.ArgumentParser()
parser.turn_off_short_opts()
这能做到吗?如果没有,我可以用什么来完成这个?
感谢
只需预先检查 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)
单破折号长参数不是问题:
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') .