【问题标题】:sed-style "-i[ext]" option parsing in PythonPython 中的 sed 样式“-i[ext]”选项解析
【发布时间】:2017-01-08 10:01:37
【问题描述】:

在 Python 中,我如何(无需重新发明 argparse 轮子)支持命令行选项语法 à la sed -i,其中一个选项采用可选参数 if & only if选项和它的参数之间没有空格吗?

天真地,我希望 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+ 的答案。

【问题讨论】:

    标签: python command-line-arguments


    【解决方案1】:

    这里是快速而肮脏的解决方法。

    首先,手动检查sys.argv[1:] 并检查选项(带有nargs='?', const='')是否在没有可选参数的情况下使用(包括我们在此处尝试解决的-o posarg 情况)。

    如果是这样,请修改它以防止它使用尾随位置参数,方法是在其末尾附加 =

    然后将修改后的 args 显式赋予 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='')
    

    【讨论】:

      猜你喜欢
      • 2021-03-21
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2021-09-14
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多