2015-05-19 3 views
0

Я планирую написать команду с помощью argparse библиотеки, это моя командная структура:Подпрограмма Python argparse действительна?

$ python cvs.py -d my_adress local diff -r xyz -N -d details 

Здесь, локальная команда имеет несколько сгруппированных к нему, такие как локальные фиксации, местные и т.д. добавить Э.Г. [-d my_address] анализируется в главном, а все переключатели после локального разбора анализируются функцией, выполняемой для локального diff.

Аналогично, имеется другая группа команд, параллельная локальной; говорят глобальные.

Коммутатор -d не смешивается с -r. Итак, синтаксический анализ парсера -r не знает о -d и наоборот.

Можно ли реализовать это с помощью argparse? Если да, может кто-нибудь предложить мне приблизительный алгоритм для этого. Если нет, что еще может сделать это в python? Спасибо.

+0

Ваше описание нечеткое. Что вы подразумеваете под «local», в команде есть несколько команд [s]? Отмеченные аргументы, такие как '-d', анализируются независимо и могут встречаться в любом порядке. Помните, что 'argparse' анализирует ваш вход, но не выполняет его. – hpaulj

ответ

1

См. Параметр nargs, а именно: '*'. Он не будет делать подпапку (я не думаю, что это может быть для argparse), но он по крайней мере сгруппирует ваши варианты, чтобы вы получили -d и -r вернулись как отдельные опции. -N не будет известным вариантом. Я не знаю, будет ли argparse считать ошибку (которую вы не хотите), или просто еще один параметр -r.

Ваш подход может потерпеть неудачу. Подкоманды CVS могут иметь все виды однобуквенных опций, таких как -d, -r и т. Д. (Это a long list). Вы обнаружите, что постоянно делаете жесткий выбор того, хотите ли вы поддержать определенный вариант CVS в качестве подкоманды или, скорее, использовать письмо для своего cvs.py.

Вы можете ввести некоторую разметку для разделения подкоманд CVS, то есть python cvs.py -d my_adress local diff § -r xyz -N. Тем не менее, это не настоящее улучшение по сравнению с cvs -d my_adress local diff; cvs -r xyz -N.