Командная строка с Python - PullRequest
0 голосов
/ 07 мая 2018

Я разрабатываю простой проект с целью или изучаю Python, на самом деле у меня версия 3.6, и я хотел создать инструмент командной строки для генерации пароля с конкретными критериями. Так что плата за проезд вот что я получил:

import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-a", "-auto", help="auto mode", action="store_true")
group.add_argument("-m", "-manual", help="manual mode", action="store_true")
parser.parse_args() 

тупик - я понятия не имею, как ограничить команду, например -l -lenght необходимостью иметь -m другой останов, как определить -l, чтобы он мог принять значение, например -l:8 чтобы указать пароль из 8 символов, я также хочу установить предел диапазона для значений -l, например -l:8-256 и, наконец, я не понимаю разницу между - и -- при определении параметров.

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете определить пользовательский тип для проверки на допустимые значения:

from argparse import ArgumentTypeError

def passwd_len(s):
    try:
        s = int(s)
    except ValueError:
        raise ArgumentTypeError("'%s' is not an integer" % (s,))

    if not (8 <= s <= 256):
        raise ArgumentTypeError("%d is not between 8 and 256, inclusive" % (s,))

    return s

parser.add_argument("--length", "-l", type=passwd_len)

Разница между -- и - является одним из соглашений. Исторически, параметры были однобуквенными аргументами с префиксом -, и группы параметров можно было объединять: -ab было таким же, как -a -b. Чтобы поддерживать это соглашение и разрешать более длинные имена опций, новое соглашение использования -- для префикса многосимвольных имен. --length - это одна опция, а не группа из шести вариантов -l, -e, -n, -g, -t и -h. Длинные опции не могут быть сгруппированы.

Я бы определил опции -a и -m следующим образом:

group = parser.add_mutually_exclusive_group()
group.add_argument("-a", "--auto", help="auto mode", action="store_const", const="auto", dest="mode")
group.add_argument("-m", "--manual", help="manual mode", action="store_const", const="manual", dest="mode")
group.add_argument("--mode", choices=["auto", "manual"])

Теперь вместо двух логических атрибутов, которые никогда не могут иметь одинаковое значение, у вас есть только один атрибут, значение которого вы можете проверить напрямую. Подумайте о --mode как о каноническом способе выбора режима, а -a и -m - как ярлыки для выбора определенного режима.

0 голосов
/ 07 мая 2018

То, что вы ищете, это опция выбора.

add_argument('--length', type=int, choices=range(8,257)

Это будет принимать только целые значения от 8 до 256 (включительно).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...