为什么 Python `argparse` 停止记录 nargs=REMAINDER?

Cur*_*son -4 python argparse

在 Python 模块的文档中argparse3.8 文档指出nargs可以设置为:

\n
\n

argparse.REMAINDER。所有剩余的命令行参数都收集到一个列表中。这对于分派到其他命令行实用程序的命令行实用程序通常很有用。

\n
\n

这已从3.9 文档中删除,尽管没有提到它已被弃用,也没有任何充分的理由这样做,因为它提供了其他方式显然没有提供的有用功能。\xc2\xb9 它的存在在页面的其他地方仍然提到

\n
\n

这些[混合]解析器不支持所有 argparse 功能,如果使用不支持的功能,则会引发异常。特别是,不支持子解析器、argparse.REMAINDER 以及包含可选值和位置值的互斥组。

\n
\n

但即使如此,[3.10 文档] 中也删除了这一点。然而,即使在最新发布的 Python 3.11.4 版本中,该功能仍然存在。

\n

那么为什么它从文档中删除了呢?

\n
\n

我问这个问题是因为这个答案似乎可能直接关系到我关于用 Python 编程参数解析器的其他几个相关问题。(我曾经、现在和可能继续使用的特定情况nargs=REMAINDER足够大,我认为如有必要,它们应该作为单独的问题发布。)考虑因素包括:

\n
    \n
  • 为了我的目的,API 是否在某种程度上被破坏了,这是否意味着我使用它的代码也被破坏了?
  • \n
  • 我应该寻找这个 API 的替代品吗?
  • \n
  • 我应该在新代码中继续使用这个 API 吗?毕竟,它还没有被弃用。
  • \n
  • 我是否应该将使用此 API 的现有代码转换为使用其他内容?
  • \n
\n

(另请注意,此类问题的答案不仅取决于特定的上下文nargs=REMAINDER使用的特定上下文,而且还可能被视为意见问题,这是将它们超出本问题范围的另一个原因。)

\n
\n

\xc2\xb9nargs=REMAINDERnargs=\'*\': using不同,using 意味着 argparse从那时起REMAINDER不会尝试解析选项(以 开头)。因此,-with不会尝试将 解析为 的选项,而是将按原样处理该行REMAINDERmycmd -q run bash -c exit-cmycmdmycmd -q run -- bash -c exit\'*\'

\n

[3.10 文档]

\n

Nic*_*ell 5

您可以在此处查看有关为何删除此内容的讨论。

本质上,它已从文档中删除,因为它非常脆弱。该功能的原始作者编写了一个文档示例,但对该示例进行的非常小的更改(例如将REMAINDER参数放在第一位)会破坏它。从文档中删除它会引导新用户远离它,而不会出现完全删除它的向后兼容性问题。(注:这种描述是有争议的;请参阅评论了解原因。)

另一种方法是使用 来获取无法识别的参数,而不是获取剩余的参数parser.parse_known_args()例子。这种方法仍然有记录。

有关删除文档的 PR,请参阅此处此处。