written on Thursday, February 9, 2012

Consoleargs

Чому?

Нещодавно я писав консольну тулзу Python і зрозумів, що парсери командного рядка для Python є перескладненими та написані в стилі, що нагадує Java. Тому я створив власну штуку, яка базується на декораторах та магії docstring.

Годі балакати, показуйте код!

Ось він:

from consoleargs import command

@command def main(dest, verbose=0, all=False, key=[]): pass

if name == 'main': main()

І цей невеликий фрагмент може обробляти таку кількість параметрів командного рядка та генерувати різні типи аргументів — логічні, списки, цілі числа та позиційні.

cmd here cmd here -v cmd here --verbose 2 cmd here -vvvvv cmd here --all cmd here -av cmd here -k myself -k green --key fat cmd --help

Пояснення

Перший приклад простий. Позиційний аргумент "here" зберігається у змінній dest , решта аргументів мають значення за замовчуванням.

Другий показує, як керувати рівнем деталізації. Значення "verbose" за замовчуванням було 0, тому додавання "-v" збільшує рівень до 1.

Наступний приклад встановлює точне значення для тієї ж змінної замість підрахунку. Тепер "verbose" дорівнює int(2).

Тут така ж магія, як у другому прикладі, але "-v" повторюється п'ять разів, тому "verbose" дорівнює int(5). Зауважте, це не просто п'ять "-v", а п'ять "-v" плюс значення за замовчуванням.

Наступний встановлює аргумент "all" у значення True.

Можна комбінувати короткі форми різних аргументів, збільшуючи рівень деталізації та встановлюючи логічний аргумент у True.

Значення за замовчуванням для "key" — порожній список, тому повторення -k з різними значеннями призводить до того, що всі вони передаються у функцію як список. Key == ["myself", "green", "fat"]

Автоматична довідка

Останній приклад показує довідку! У цьому короткому прикладі довідка відображатиме лише список усіх опцій та їх короткі форми.

Якщо ви хочете пояснити параметри корисними повідомленнями, використовуйте docstring:

from consoleargs import command

@command def main(dest, verbose=0, all=False, key=[]): """ :param verbose: говорити без зупинки :param all: не запитувати підтвердження :param key: які ключі використовувати для підпису """ pass

if name == 'main': main()

Згенерована довідка:

Використання c.py DEST [OPTIONS]

Опції: --all -a не запитувати підтвердження --verbose -v говорити без зупинки --key -k які ключі використовувати для підпису

Ще трохи магії

Усі аргументи без значень за замовчуванням вважаються простими позиційними аргументами. Перший приклад показує лише один позиційний аргумент, але їх може бути більше. Додатково можна оголосити перший аргумент як список, і тоді всі позиційні аргументи потраплять до нього.

@command(positional=("dest",)) def main(dest=[], verbose=0, all=False, key=[]): pass

cmd here there all we are -v

Тепер dest == ['here', 'there', 'all', 'we', 'are'], а 'verbose' = int(1)

This entry was tagged