Какова цель этого цикла for?

#python

#python

Вопрос:

Я следую за книгой «Black Hat Python», и текущая деятельность заключается в создании замены netcat. Для установки параметров используется ‘getopt’. Я был смущен тем, почему o,a используется в цикле for для проверки параметров?

   if not len(sys.argv[1:]):
        usage()

    # read the command line options
    try:

           opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", 
           ["help", "listen", "execute", "target", "port", "command", "upload"])
    except getopt.GetoptError as err:
           print(str(err))
           usage()

    for o,a in opts:
            if o in ("-h","--help"):
                    usage()
            elif o in ("-l", "--listen"):
                    listen = True
            elif o in ("-e", "--execute"):
                    execute = a
            elif o in ("-c", "--commandshell"):
                    command = True
            elif o in ("-u", "--upload"):
                    upload_destinaton = a
            elif o in ("-t", "--target"):
                    target = a
            elif o in ("-p", "--port"):
                    port = int(a)
            else:
                    assert False,"Unhandled Option"
  

Комментарии:

1. getopt на самом деле он никогда не предназначался для нового кода, а служил вспомогательным средством для переноса существующих программ, которые использовали getopt библиотеку. Вы должны использовать argparse для обработки параметров командной строки.

Ответ №1:

Если вы посмотрите на страницу документации для python getopt, там есть пример, который демонстрирует это:

 >>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')]  # <--- HERE
>>> args
['a1', 'a2']
  

opts (в вашем вопросе) соответствует optlist в приведенном выше примере.

getopt возвращает список кортежей в качестве первого возвращаемого значения (и список в качестве второго), поэтому с помощью for o,a in opts код разбивает эти кортежи на части во время каждой итерации цикла.

Ответ №2:

opts это список пар параметров и значений. Смотрите документы:

Возвращаемое значение состоит из двух элементов: первый — это список пар (опция, значение); второй — это список аргументов программы, оставшихся после удаления списка опций (это завершающий фрагмент аргументов). Каждая возвращаемая пара параметров и значений имеет параметр в качестве первого элемента, с префиксом через дефис для коротких параметров (например, ‘-x’) или двумя дефисами для длинных параметров (например, ‘—long-option’), и аргумент option в качестве второго элемента или пустую строку, если у параметра нет аргумента. Параметры отображаются в списке в том же порядке, в котором они были найдены, что позволяет использовать их несколько раз. Длинные и короткие варианты могут быть смешаны.

Итак, цикл for обрабатывает каждый из аргументов командной строки, то есть пары option, value за раз. Количество аргументов может варьироваться по количеству.

Вас интересует что-то более конкретное?

Комментарии:

1. да, мне было интересно, почему были использованы опции ‘o’ и ‘a’. означает ли ‘o’ что-то внутри getopt?

2. Ах, o и a — это произвольные имена переменных в конструкции цикла; с таким же успехом они могли бы быть x и y . Важно то, что for цикл присваивает им два элемента из каждого 2-го кортежа в opts. (opts — это просто список из двух кортежей, соответствующих парам option:value, как продемонстрировал @Kingsley выше)