【问题标题】:efficient and complete input check for command line argument and option with python使用 python 对命令行参数和选项进行高效和完整的输入检查
【发布时间】:2010-10-26 18:26:22
【问题描述】:

我正在使用 python 版本 2.4.3 开发 cli。我想要输入异常检查。以下是部分代码。有了这段代码,我可以输入

addcd -t 11 

如果我输入

addcd -t str_not_int

addcd -s 3

我会发现错误类型参数和错误选项的错误。然而,这还不够。例如

addcd s 11

addcd s a 

那么 optparse 无法检测到这种错误输入。

消除这种情况 “addcd s a 11 21”,我通过检查参数的数量来添加一些东西,但我不知道它是否是正确的方法。

那么,如何为 CLI 实施彻底/高效的输入检查?

class OptionParsingError(RuntimeError):
    def __init__(self, msg):
        self.msg = msg

class OptionParsingExit(Exception):
    def __init__(self, status, msg):
        self.msg = msg
        self.status = status

class ModifiedOptionParser(optparse.OptionParser):
    def error(self, msg):
        raise OptionParsingError(msg)

    def exit(self, status=0, msg=None):
        raise OptionParsingExit(status, msg)

class CDContainerCLI(cmd.Cmd):
    """Simple CLI """
    def __init__(self):
        """ initialization """ 
        cmd.Cmd.__init__(self) 
        self.cdcontainer=None

    def addcd(self, s):
        args=s.split()
        try:
            parser = ModifiedOptionParser()
            parser.add_option("-t", "--track", dest="track_number", type="int",
               help="track number")
            (options, positional_args) = parser.parse_args(args)
        except OptionParsingError, e:
            print 'There was a parsing error: %s' % e.msg
            return
        except OptionParsingExit, e:
            print 'The option parser exited with message %s and result code %s' % (e.msg, e.status)
        return
        if len(args) != 4:
            print "wrong number of inputs"
            return

        cd_obj= CD()
        cd_obj.addCD(options.track_number, options.cd_name)

【问题讨论】:

标签: python command-line-arguments


【解决方案1】:

首先,阅读此http://docs.python.org/library/optparse.html#terminology

您没有遵循选项的 optparse 规则。如果你不遵守规则,你就不能使用这个库。

具体来说。

addcd s 11

addcd s a 

不是合法选项。不 ”-”。不 ” - ”。为什么没有“-”?

"那么它就无法检测到。"

无法检测到什么?无法检测到它们的存在?当然不是。它们不是合法的选择。

无法检测到选项参数的类型是否正确?当然不是。它们一开始就不是合法的选择。


去掉“addcd s a 11 21”的大小写

由于这些看起来都不是合法的选择,所以optparse 帮不了你。这些不是“选项”。

那些是“论据”。它们将在变量positional_args 中找到。 但是,您没有使用该变量。为什么不呢?


确实,这段代码

    return
    if len(args) != 4:
        print "wrong number of inputs"
        return

完全没有意义。在return 之后不能执行任何语句。为什么要在return 后面写代码?

为什么在解析args 之后检查args 的len?它已经被解析了,现在关心它有多长已经太迟了。

【讨论】:

  • 所以你的意思是 optparser 根本无法检查它,我必须自己进行命令语法检查?在这种情况下,optparse的含义是什么?因为如果我必须自己检查语法,我还可以检查选项和参数类型,它们只是其中的一部分。 "return" 是返回有新的输入
  • @pepero:请阅读 optparse 规则。选项以“-”开头。你关于“s 11”和“s a”的东西没有“-”。没有“-”,它们不是合法的选择。你为什么显示没有“-”的例子?
  • 嗨,S.Lott,感谢您的评论。我问这个是因为我希望我的 cli 健壮。虚拟用户可以输入任何内容。
  • 是的,虚拟用户可以输入他们想要的任何内容,而您必须处理它。 Optparse 帮助您解析和验证选项。您没有前导“-”的案例不是选项,那些是 arguments (显然) option parser 不关心。程序对其参数的实际操作通常(阅读:总是)特定于该程序,您不会找到验证它的库。
  • @pepero:“虚拟用户可以输入任何内容”。这就是您 (1) 生成错误消息、(2) 提供帮助和 (3) 编写文档的原因。您不会尝试解析由虚拟用户输入的随机废话。您提供帮助,以便虚拟用户键入正确的内容。和英语一样。只有按正确顺序排列的单词才是英语。随机 asdkfjn asjd ;akdjshf lkjadsf ;a 不是英文。
猜你喜欢
  • 2013-09-13
  • 2015-04-12
  • 2010-10-14
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多