2013-05-31 5 views
17

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

Мои варианты блок выглядит так:

Options: 
    --help      Show this message and exit 
    --version     Show version info and exit 
    -w WIDTH --width=WIDTH  The out to out width of the deck (feet) [default: 73] 
    -g GIRDERS --girders=GIRDERS The number of girders [default: 8] 
    -h HEIGHT --height=HEIGHT The height of the girders (inches) [default: 56] 
    -t THICK --thick=THICK  The deck thickness (inches) [default: 8] 
    -a ADIM --adim=ADIM   The "A" dimension, max deck thick @ CL girder [default: 12] 
    -l LSLP --leftslope=LSLP  The left-hand deck slope (ft/ft) [default: -0.02] 
    -r RSLP --rightslope=RSLP The right-hand deck slope (ft/ft) [default: -0.02] 
    -c --center     Indicates pivot point is at center of bridge 
    -o OFFSET --offset=OFFSET The offset of pivot point from center [default: 0] 

Опция girders не имеет значения по умолчанию!

Я перечитал this question несколько раз, но кажется не связанным.

+10

Мое предположение: должно быть не менее * 2 * пробелов перед каждым описанием опции – jfs

+1

Мое предположение также - у меня была та же проблема, см. Http://stackoverflow.com/questions/13995352/why-are-defaults-not -appearing-в-моем-командной строки аргументов-словаря из-docop/20283560 # 20283560 – hargriffle

ответ

24

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

В строке 200 в методе синтаксического анализа на классе Option является регулярным выражением используется, чтобы захватить значения по умолчанию:

matched = re.findall('\[default: (.*)\]', description, flags=re.I)

После печати кучи окружающего переменного я обнаружил, что значение description варов было пустая строка. Вот строка, которая задает описание:

options, _, description = option_description.strip().partition(' ')

Та часть, которая поймала мой глаз был такой: .partition(' '), это два места. Таким образом, после обновления моего кода успешно я направляюсь обратно в документацию и поиска «пространства»: https://github.com/docopt/docopt#option-descriptions-format шестой пуля:

«Используйте два пробела для разделения параметров с их неформальным описанием»

TL; DR RTFM (или, по крайней мере, код).

Дополнительный совет: docopt понимает описания нескольких строк, так что вы можете просто обернуть все, что пересекает линию 80 символов:

Options: 
    --help      Show this message and exit 
    --version      Show version info and exit 
    -w WIDTH --width=WIDTH  The out to out width of the deck (feet) 
           [default: 73] 
    -g GIRDERS --girders=GIRDERS The number of girders [default: 8] 
    -h HEIGHT --height=HEIGHT  The height of the girders (inches) 
           [default: 56] 
    -t THICK --thick=THICK  The deck thickness (inches) [default: 8] 
    -a ADIM --adim=ADIM   The "A" dimension, max. deck thickness at 
           centerline of girder (inches) [default: 12] 
    -l LSLP --leftslope=LSLP  The left-hand deck slope (ft/ft) 
           [default: -0.02] 
    -r RSLP --rightslope=RSLP  The right-hand deck slope (ft/ft) 
           [default: -0.02] 
    -c --center     Indicates pivot point is at center of bridge 
    -o OFFSET --offset=OFFSET  The offset of pivot point from center 
           [default: 0] 

Не совсем, как читаемый, но разбирает правильно.

Смежные вопросы