эффективная и полная проверка ввода для аргумента командной строки и опции с Python - PullRequest
1 голос
/ 26 октября 2010

Я разрабатываю Cli с Python версии 2.4.3. Я хочу, чтобы проверка входных исключений. Следующее является частью кода. С помощью этого кода я могу набрать

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)

1 Ответ

2 голосов
/ 26 октября 2010

Сначала прочитайте это http://docs.python.org/library/optparse.html#terminology.

Вы не следуете правилам optparse для опций.Если вы не следуете правилам, вы не сможете использовать эту библиотеку.

В частности.

addcd s 11

или

addcd s a 

Не являются допустимыми вариантами.Нет "-".Нет "-".Почему нет "-"?

", тогда он не может обнаружить."

Не может обнаружить что?Не можете обнаружить, что они присутствуют?Конечно, нет.Это недопустимые опции.

Не можете определить, что параметры опции имеют правильный тип?Конечно, нет.Для начала они не являются допустимыми вариантами.


исключите случай "addcd sa 11 21"

Поскольку ни один из этих вариантов не выглядит как допустимый, то optparse can 'Тебе помочь.Это не «варианты».

Это «аргументы».Они будут найдены в переменной positional_args.Однако вы не используете эту переменную.Почему бы и нет?


Действительно, этот код

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

не имеет никакого смысла вообще.После return оператор не может быть выполнен.Зачем писать код после return?

Зачем проверять len args после анализа args?Уже разобрано, уже слишком поздно беспокоиться о том, сколько времени прошло.

...