Разбор аргументов командной строки в opster

2010-09-11

Попробовал библиотеку @asolovyov для разбора аргументов командной строки в Python, которая называется opster (вот доки, исходники). Это ещё одна библиотека, решающая те же задачи, что и стандартные getopt, optparse и argparse.

Впечатления приятные. Кода действительно надо писать меньше. Самая главная идея — отделить код обработки опций от кода функции, которой они нужны как аргументы. То есть если у меня есть функция:

def test(arg1, arg2, include=[], exclude=[], verbose=False):
    '''A test command.'''
    ...

то для превращения её в утилиту командной строки мне не надо её менять, только снабдить декоратором @command или обернуть её в этот декоратор непосредственно в main:

@command(usage='%name [hIXv] arg1 arg2',
         options=[
             ('I', 'include', [], 'include names'),
             ('X', 'exclude', [], 'exclude names'),
             ('v', 'verbose', False, 'be more verbose')])
def test(arg1, arg2, include=[], exclude=[], verbose=False):
    '''A test command.'''
    ...

Получилось 5 строк. Этот же пример на getopt занимает где-то 30 строк.

Затем можно вызвать функцию, передав аргументы командной строки:

if __name__ == '__main__':
    test(argv=sys.argv[1:])

либо вызывать как обычную функцию:

test('foo', 'bar', include=['path1', 'path2'], verbose=True)

При этом у программы появится автоматическая справка по -h:

$ ./test -h
test [hIXv] arg1 arg2

A test command.

options:

 -I --include  include names
 -X --exclude  exclude names
 -v --verbose  be more verbose
 -h --help     show help

Ещё несколько слов об особенностях. Есть поддержка подкоманд (в духе Mercurial, Git). Нет обязательных опций, но это даже хорошо. Какой смысл в обязательных опциях? Есть поддержка задания одной опции несколько раз (значений типа [str]), а также значений bool, str, int и интересных значений str -> a, то есть функций по преобразованию значения во что угодно.

Из минусов можно назвать не всегда корректную работу с Unicode, stack trace при указании неверных значений опций вместо красивых сообщений об ошибках, невозможность задать только короткое имя опции и ещё несколько мелочей.

Библиотека opster определённо заслуживает внимания.

См. также: