Как мне преобразовать набор строк Python в динамически определенные типы? - PullRequest
3 голосов
/ 12 сентября 2011

Я пишу простое приложение на Python, использующее модуль cmd для обеспечения интерфейса типа CLI. Команды, предоставляемые моим CLI, имеют списки параметров, которые сильно различаются. Каждый обработчик команды получает строковый аргумент, содержащий часть строки, которая содержит аргументы; Я планирую разбить их на кортежи, используя shlex.split. Впоследствии я ищу наиболее Pythonic способ взять этот набор строк, проверить, что они правильно сформированы, и преобразовать их в набор четко определенных числовых типов.

Пример: У меня есть функция foo, которая принимает 3 аргумента: первый - это путь к файлу на диске, второй - значение с плавающей запятой, а третий - целое число, как:

foo /home/jason/file.bin 123.456 123456

Мне бы хотелось, чтобы это был точный способ указать, что-то похожее на использование C sscanf() со строкой форматирования "%s %f %d" (я понимаю проблемы обработки пробелов, присущие этому подходу; это просто иллюстрация).

Я знаю, что могу добиться этого, написав стандартный код для каждой функции-обработчика, которая вызывает int(), float() и т. Д. И соответствующим образом перехватывает исключения. Просто кажется, что должен быть более чистый способ сделать это.

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Я бы предложил предоставить производственные правила в виде функций, анализирующих аргументы, и вызвать исключение для недопустимых аргументов.так.Ваш пример может выглядеть так:

FOO_SYNTAX = (file, float, int)
def foo_cmd(infile, infloat, inint):
    pass

def parse_args(rule, args):
    if len(rule) != len(args):
        raise ValueError, "Wrong number of arguments"
    return [rule_item(arg) for rule_item, arg in zip(rule, args)]

COMMANDS = {'foo': (FOO_SYNTAX, foo_cmd)}

def dispatch(line):
    cmd, rest = line.split(None, 1)
    args = rest.split()
    syntax, cmd_func = COMMANDS[cmd]
    cmd_func(*parse_args(syntax, args))
2 голосов
/ 12 сентября 2011

В зависимости от того, используете ли вы Python 2.6 или 2.7, вы можете использовать встроенный optparse или argparse, соответственно.

http://docs.python.org/library/argparse.html

Они могут быть немного тяжеловесными, но они будут выполнять преобразование в целые числа, числа с плавающей запятой или любой другой тип, который вам нужен, как часть синтаксического анализа, и он может автоматически создавать сообщения об использовании и другие приятные аргументы при разборе.

...