gpt4 book ai didi

python:argparse 中奇怪的错误行为

转载 作者:太空宇宙 更新时间:2023-11-03 18:32:59 25 4
gpt4 key购买 nike

argparse 在组合标志 (-x -y > -xy) 时给出了不同的结果。这很难用语言解释,所以我将问题简化为以下最小设置:

# test.py
def invalid_argument_type(x):
raise Exception("can't parse this") # in my code, it doesn't *always* fail

parser = argparse.ArgumentParser()

parser.add_argument('args', type = invalid_argument_type)
parser.add_argument('-x')

print parser.parse_args()

现在,错误地调用该程序会产生意想不到的结果。第一个命令是正确的,第二个命令有一个无效标志,第三个命令应该与第二个命令相同:

$ python test.py -x foo
Namespace(args=[], x='foo')

$ python test.py -A -x foo
test.py: error: unrecognized arguments: -A

$ python test.py -Ax foo
Exception: can't parse this

看起来,当标志组合在一起时,“未知标志”错误会吞噬 -x ,并且 foo 被视为常规参数。请注意,如果存在 -A 标志,则 -A-x 在每种情况下都将按预期工作。

这会导致高度困惑的错误消息。

我使用argparse错误吗?有没有办法解决这个问题,或者我应该将错误处理移交给我自己?

最佳答案

您看到这一点是因为参数解析期间发生的异常比简单的参数错误更重要。参数解析确实识别出-Ax是一个无效标志,并简单地记录下来以便稍后显示;但由于 args 的解析失败并出现异常,因此会立即显示该异常,并且不再提及其他无效参数。

您还可以从源头确认此行为。 parse_args将解析步骤委托(delegate)给 parse_known_args ,它返回解析后的命名空间和无效参数列表。 parse_known_args但是会在内部尝试解析它,并在出现异常时立即显示该异常。因此,在 parse_args 显示无效参数之前,异常将中止该过程。

现在,您的三个示例的工作方式都不同,这就是为什么您只看到最后一个示例的异常。那么让我们详细检查一下它们:

  • -x foo:这里,-x 是有效的参数名称,foo 是它的值。所以一切都很好。
  • -A -x foo:-A 是一个无法识别的参数,因此被记录下来。其余部分是 -x foo,它又是参数 x 的有效序列。
  • -Ax foo:-Ax 是一个无法识别的参数,因此再次记录下来。剩下的部分是foo。由于没有参数标志,解析器将尝试将其与 args 参数匹配,然后引发异常。

请注意,argparse 仅在可以正确从左到右解析这些标志的情况下才支持组合标志 (-Ax)。因为单破折号标志也可以长于一个字符(例如 -foo 就可以了),所以不能安全地说 -Ax 将是 -A - x 因为您实际上可以定义一个 -Ax 参数。为了能够做出这个语句,它实际上会开始解析 -Ax ,它首先会尝试找到与其匹配的参数。由于没有 -A 参数,因此假定它应该是 -Ax。但这也不存在,所以它失败了。

关于python:argparse 中奇怪的错误行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22107764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com