在 Python 中,我如何(无需重新发明 argparse
轮子)支持命令行选项语法 à la sed -i
其中一个选项采用可选参数当且仅当选项与其参数之间没有空格?
我天真地希望 argparse
通过设置 nargs='?'
来支持这一点,如下所示:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-i', dest='backup', nargs='?', const='')
>>> parser.add_argument('arg', nargs='*')
...但它没有:
>>> parser.parse_args(['-i', '~'])
Namespace(backup='~', arg=[]) # wanted: Namespace(backup='', arg=['~'])
我有哪些选择?我更喜欢在 Python 2.7 和 Python 3.3+ 中都有效的答案。
最佳答案
这里是快速而肮脏的解决方法。
首先,手动检查 sys.argv[1:]
并检查选项 (with nargs='?', const=''
) 是否用于没有可选参数(包括我们试图在此处解决的 -o posarg
情况)。
如果是这样,请修改它以防止它消耗尾随位置参数,方法是在其末尾附加 =
。
然后显式地将修改后的参数传递给 parser.parse_args(argv)
函数。
以下是示例脚本:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-i', dest='backup', nargs='?', const='')
parser.add_argument('arg', nargs='*')
print(parser.parse_args(['-i', '~'])) # gives Namespace(arg=[], backup='~')
print(parser.parse_args(['-i=', '~'])) # gives Namespace(arg=['~'], backup='')
关于python - Python 中的 sed 样式 "-i[ext]"选项解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255939/