Как вы можете спроектировать скрипт, который готов принимать различное возможное количество аргументов как argv? - PullRequest
0 голосов
/ 30 мая 2019

Когда вы даете функции набор необходимых аргументов или присваиваете argv, код требует, чтобы вы указали правильное количество аргументов или он продолжает выдавать «ожидаемое количество вещей, которые нужно распаковать из кортежа», сортируетошибок.

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

В конце концов я представляю себе создание сценариев с --help, чтобы переключить этот списоквсе возможные argv и опции, которые вы можете добавить, но пока я начинаю, давайте сделаем это очень , несколько просто:

Я хочу, чтобы следующее невыдает ошибку и не ОЖИДАЕТ выдаваемых аргументов, но принимает их, когда они есть:

#!/usr/bin/env python3

from sys import argv

script, verbose_option, user_input = argv

if "verbose" in verbose_option:
    verbose_option = True
else:
    verbose_option = False

x = value
if verbose_option == True:
    print("var x is set to value...")
else:
    pass

if user_input == True: # if true, the var contains any value, correct?
    print(user_input)
else:
    print("user_input not given but, ... no problem!")
    user_input = input("> ") # or maybe it has a default value that can be changed from argv

if verbose_option == True:
    print("Would I really need this conditional on every line I left a verbose explanation on?")
else:
    pass

Каким-то образом он должен знать, что user_input не предназначен для многословия только потому, что многословия нет, поэтому... может быть, условная ветвь, которая проверяет len() кортежа аргументов и цифр, "ну, это должно быть то, а не то, что основано на этом числе. ИЛИ ... это слишком сложно и есть лучший способ?

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

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Вы можете перебирать аргументы следующим образом:

def handle_arguments(argv):
    env = {'user_input': []}
    for arg in argv:
        if arg in ['-v', '--verbose']
            env['verbose'] = True
        elif arg in ['-h', '--help']
            display_help()
            sys.exit(0)
        else
            env['user_input'] += [arg]

    if length(env['user_input']) == 0
        env['user_input'] = input('> ')
    else
        env['user_input'].join(' ')

    return env

там у вас есть функция, которая принимает аргументы и возвращает правильно сформированную env переменную.

Итак, вы можете передать sys.argv в handle_arguments, удалив бесполезный sys.argv [0] (бесполезный в этом контексте)

import sys

if __name__ == "__main__":
    env = handle_arguments(sys.argv[1:])
    do_stuff(**env)

где stuff - это либо функция со следующим прототипом:

def do_stuff(user_input='', verbose=False):

или вы можете заставить его принять любой аргумент:

def do_stuff(**kwargs):

При этом это более или менее базовая внутренняя работа библиотеки разбора аргументов. И чтобы сделать это правильно, ожидаемый пользователями CLI, вам лучше использовать его, например Click , argparse или мой любимый docopt .

0 голосов
/ 30 мая 2019

Конечно, есть несколько пакетов для разбора arg, но, если вы хотите сделать это с нуля, вы можете попробовать что-то вроде:

args = sys.argv
if args:
    #Verbose would be a boolean, true if -v in args, false if not
    verbose = '-v' in args
    #Same thing here, making a boolean based on existence
    help = '--help' in args
    #Here we are assuming the arg after '-x' is some variable we want to store
    x = args[args.index('-x') + 1] if '-x' in args else None

Для ваших условий, если 'verbose' - логическое значение, вам нужно всего лишь использовать:

if verbose:
   do_something

Или вы можете сделать что-то вроде:

print('Hello') if verbose else None
...