Python argparse - 带有 dict 选项的选项

Posted

技术标签:

【中文标题】Python argparse - 带有 dict 选项的选项【英文标题】:Python argparse - option with options to dict 【发布时间】:2016-08-11 22:53:42 【问题描述】:

我正在尝试使用 argparse 解析一些选项。我发现讨论了一些类似的问题,并发现了我认为与欧文在Options with Options with Python argparse? 中给出的明智解决方案类似的问题

我希望能够指定,例如:

script.py infile --line <path to file1> beglab='str1' endlab='str2' 
                 --line <path to file2>  
                 --line <path to file3> beglab='str3' 
                 outfile

--line 可以多次指定。最初,我没有为 line 选项提供额外的参数,我能够毫无问题地创建文件列表:

parser.add_argument("--line", action='append')

现在我需要有选择地添加标签以配合线条。如上所示,给定行可以有 0、1 或 2 个标签。这就是为什么我觉得提供的链接中的示例似乎很合适,不幸的是,当我尝试时:

parser.add_argument("--line", action='append', nargs="+")

然后运行:

script.py infile --line somefile beglab='A' endlab='B' 
                 --line otherfile beglab='a' endlab='b' outfile

script.py infile --line somefile outfile

我收到一条错误消息,指出参数太少。如果我从命令中删除 --line 选项,所以我只有位置选项,它可以工作,所以我知道我没有错过任何需要的东西。所以我去了,我阅读了 nargs 选项。如果指定了--line,它必须至少有文件名,因此我认为nargs='+' 是合适的选项,它在帮助[--line LINE [LINE ...]] 中看起来差不多,所以我真的很困惑这个错误来自哪里.

我很高兴考虑处理这个问题的替代方法,我只是喜欢提供这样的输入并用它们创建字典的简单性。

【问题讨论】:

'+' 是贪婪的,将所有字符串分配给--line(直到最后或下一个--)。因此它没有给outfile 留下任何东西。存在探索为以下位置保留值的错误/问题,但这不会很快改变。其他 SO 问题也涵盖了这一点。但是公认的答案很好。 【参考方案1】:

您要构建的解析器不明确。如果 endlab='b' 是可选的,则 argparse 无法判断运算符是否打算将 outfile--line 的参数或位置参数。

您不必更改解析器,但必须更改命令行:

试试:

script.py infile outfile
          --line somefile beglab='A' endlab='B' 
          --line otherfile beglab='a' endlab='b' 

或者:

script.py infile 
          --line somefile beglab='A' endlab='B' 
          --line otherfile beglab='a' endlab='b' 
          --
          outfile

【讨论】:

我几乎在我的问题中问它如何知道何时停止。所以答案是它没有,这实际上解释了错误消息!真是这么简单的事情。 我刚刚注意到您的第一个示例末尾有一个额外的“outfile”需要删除。 谢谢,@emmalg。我已将其删除。【参考方案2】:

我不确定如何使用 argparse 完成此操作,但为简单起见,我会考虑执行以下操作:

--line &lt;path_to_file&gt;,&lt;beglab&gt;,&lt;endlab&gt;

然后在代码中或使用 argparse 的自定义类型功能解析参数。你可以让自定义类型函数返回一个类似'filepath':'&lt;path_to_file&gt;', 'beglab':'&lt;beglab&gt;', 'endlab':'&lt;endlab&gt;'的字典

【讨论】:

以上是关于Python argparse - 带有 dict 选项的选项的主要内容,如果未能解决你的问题,请参考以下文章

使用 argparse 和 python 接受字典作为参数 [重复]

使用argparse(python)创建变量键/值对

Python+argparse+notebook

带有 argparse 的 Python 单元测试

如何从 Python 3 中的现有程序创建带有 argparse 的子解析器?

Python argparse 字典 arg