0

我正在测试一些 argparse 代码。我想要一个可选参数,它n从选择列表中收集输入的数量。所以,我写道:

import argparse

modules = ["geo", "loc"]
parser = argparse.ArgumentParser()
parser.add_argument("--modules", nargs='*', choices=modules)

有了这个设置,我可以可靠地完全杀死解释器。

如果您传递一组有效的参数,它可以正常工作:

>>> parser.parse_args("--module geo loc geo".split())
Namespace(modules=['geo', 'loc', 'geo'])

但是如果你传入一个未形成的参数,它会完全杀死 python:

>>> parser.parse_args("--module geo metro".split())
usage: [-h] [--modules [{geo,loc} [{geo,loc} ...]]]
: error: argument --modules: invalid choice: 'metro' (choose from 'geo', 'loc')
PS C:\Users\myname\mycode>

我的问题有两个:

  1. 这是预期的行为吗?如果是这样,这是什么原因?
  2. 我可以使用这段代码吗,因为我不介意我的程序是否因格式错误的参数而死?还是有一些令人信服的理由来避免这种情况?

作为说明,我在 Windows 7 上使用 Python2.7。

4

2 回答 2

3
  1. 是的,这是有意的,并记录在案:

    在解析命令行时,parse_args() 会检查各种错误,包括不明确的选项、无效类型、无效选项、错误数量的位置参数等。当遇到此类错误时,它会退出并打印错误以及使用信息:

    这个想法是,如果用户给出了一个您不知道如何处理的无效选项或参数,最好的选择是放弃而不是事后猜测用户的实际意图。

  2. 如果你不介意,那应该没问题吧?除非您知道实现不同行为的原因,否则您的程序与所有平台上所有行为良好的命令行工具完全一致。

如果您确实想实现不同的行为,请捕获可能引发的SystemExit异常。parse_args

(我能想到的唯一与我刚才描述的行为方式不同的程序是版本控制工具 Git,它确实会尝试猜测用户的意思并打印出它的猜测。但它仍然会退出。)

于 2013-02-21T23:22:24.487 回答
1

argparse专为从命令行运行 Python 脚本时使用而设计。这就是为什么无效的参数会导致程序退出。

这种行为几乎与所有 shell (bash/sh/dos/etc.) 实用程序一致。无效的命令行参数会导致程序退出并显示错误字符串和(可选)使用消息。

于 2013-02-21T23:19:04.763 回答