用argparse杀掉翻译

时间:2013-02-21 23:15:37

标签: python windows python-2.7 argparse

我正在测试一些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. 我是否可以使用此代码,因为我不介意我的程序是否因格式错误而死亡?或者是否有一些令人信服的理由来避免这种情况?
  3. 请注意,我在Windows 7上使用Python2.7。

2 个答案:

答案 0 :(得分:3)

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

      

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

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

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

  3. 如果您确实想要实现不同的行为,请抓住SystemExit可能引发的parse_args例外。

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

答案 1 :(得分:1)

argparse旨在用于从命令行运行Python脚本。这就是无效参数导致程序退出的原因。

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