python - Python 中的 sed 样式 "-i[ext]"选项解析

标签 python command-line-arguments

在 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/

相关文章:

python - 我怎样才能向前看而忽略一个子集?

python - 使用什么来代替游标计数?

python - Timedelta在python中与 float 相乘

bash - 如何在 bash 脚本中用方括号中的范围扩展参数?

bash - 如何创建一个可以通过位置参数和命名参数接受信息的通用 Bash 函数

C++ - int main 中的 argv[] 是否应始终为 char* 类型(如果使用 argv,则为 char** 类型)?

main 中的 python 命令行参数,跳过脚本名称

python - 使用 feedparser 从博客中获取每个独特的项目。检查 for 循环中的列表成员身份不起作用

python - 如何将不同的图片正确插入到单个文件中

batch-file - 为什么命令行参数在 ELSE 中表现得很奇怪?