Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python对命令行参数和选项进行高效完整的输入检查_Python_Command Line Arguments - Fatal编程技术网

使用python对命令行参数和选项进行高效完整的输入检查

使用python对命令行参数和选项进行高效完整的输入检查,python,command-line-arguments,Python,Command Line Arguments,我正在使用python版本2.4.3开发cli。我想检查输入异常。以下是代码的一部分。使用此代码,我可以键入 addcd -t 11 如果我打字 addcd -t str_not_int 或 我将捕获错误类型参数和错误选项的错误。然而,这是不够的。e、 g addcd s 11 addcd s 11 或 然后optpass无法检测到这种错误输入 消除这种情况 “addcd s a 11 21”,我通过检查参数的数量来添加一些内容,但我不知道这是否是正确的方法 那么,如何为CLI实现彻底

我正在使用python版本2.4.3开发cli。我想检查输入异常。以下是代码的一部分。使用此代码,我可以键入

addcd -t 11 
如果我打字

addcd -t str_not_int

我将捕获错误类型参数和错误选项的错误。然而,这是不够的。e、 g

addcd s 11
addcd s 11

然后optpass无法检测到这种错误输入

消除这种情况 “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)
首先,读一下这个

您没有遵守选项的OptPass规则。如果不遵守规则,则无法使用此库

具体地说

这不是合法的选择。否“-”。“不”。为什么没有“-”

“那么它就检测不到了。”

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

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


消除“addcd s a 11 21”的情况

既然这些都不是合法的选择,那么
optpass
就帮不了你。这些不是“选项”

这些是“论点”。它们将在变量
位置参数中找到。
但是,您没有使用该变量。为什么不呢


事实上,这一准则

    return
    if len(args) != 4:
        print "wrong number of inputs"
        return
毫无意义。在
return
之后,不能执行任何语句。为什么要在返回后编写代码


为什么在解析
args
后检查
args
的len?它已经被解析了,现在想知道它有多长已经太晚了

如果您想允许多个参数,请使用
nargs='*'
注意optparse是,如果可以,请查看一下。您的意思是optparser根本无法检查它,我必须自己进行命令语法检查?在这种情况下,optpass的含义是什么?因为如果我必须自己检查语法,我也可以检查选项和参数类型,它们只是语法的一部分。“返回”是指返回有新的input@pepero:请阅读OptPass规则。选项以“-”开头。你对“s11”和“sa”的看法没有“-”。如果没有“-”,它们就不是合法选项。你为什么用不带“-”的例子?嗨,S.洛特,谢谢你的评论。我这样问是因为我希望我的cli是健壮的。虚拟用户可以键入任何内容。是的,虚拟用户键入他们想要的任何内容,您必须处理它。Optparse帮助您解析和验证选项。没有前导“-”的情况不是选项,这些是选项解析器(显然)不关心的参数。一个程序对其参数所做的实际操作通常(读:始终)只针对该程序,并且您找不到验证它的库。@pepero:“虚拟用户可以键入任何内容”。这就是您(1)生成错误消息,(2)提供帮助和(3)编写文档的原因。您不会试图解析由虚拟用户键入的随机垃圾。您提供帮助,以便虚拟用户键入正确的内容。英语也一样。只有顺序正确的单词是英语。随机asdkfjn-asjd;akdjshf lkjadsf;a不是英语。
addcd s 11
addcd s a 
    return
    if len(args) != 4:
        print "wrong number of inputs"
        return