Nano Hash - криптовалюты, майнинг, программирование

Как кодировать комбинированные параметры argparse в python

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

Требование:

   test2.py [-c/-v] -f

Использование или правила:

  1. -c (сравнить) принимает 2 параметра.

    -v (проверить) принимает 1 параметр.

    Должен присутствовать любой из этих двух элементов, но не оба.

  2. -f — обязательный параметр (имя выходного файла).

Вывод:

Я могу получить желаемый результат, как показано ниже

kp@kp:~/Study/scripts$ ./test.py -c P1 P2 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 -f p
kp@kp:~/Study/scripts$ ./test.py -v P1 
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ ./test.py -c P1 P2 
usage: test.py <functional argument> <ouput target argument>
test.py: error: argument -f/--file is required
kp@kp:~/Study/scripts$ 

Проблема:

При использовании test.py -h
1. В выводе не будет указано, что -c/-v обязателен хотя бы один из них, но не оба . Это указывает на то, что все аргументы являются необязательными.
2. В выводе будет указана опция -f под необязательными аргументами, что неверно. -f — обязательный аргумент, а снаружи я хочу вывести — необязательные аргументы.

Как изменить сценарий, чтобы вывод параметра -h был более удобным для пользователя (без какой-либо внешней проверки)

usage: test.py <functional argument> <ouput target argument>

Package Compare/Verifier tool.

optional arguments:
  -h, --help            show this help message and exit
  -f outFileName, --file outFileName
                        File Name where result is stored.
  -c Package1 Package2, --compare Package1 Package2
                        Compare two packages.
  -v Package, --verify Package
                        Verify Content of package.
kiran@kiran-laptop:~/Study/scripts$ 

Код:

Я использую приведенный ниже код для достижения результата,

#!/usr/bin/python

import sys
import argparse

def main():
    usage='%(prog)s <functional argument> <ouput target argument>'
    description='Package Compare/Verifier tool.'
    parser = argparse.ArgumentParser(usage=usage,description=description)

    parser.add_argument('-f','--file',action='store',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)


    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
    group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
    args = parser.parse_args()

if __name__ == "__main__":
    main()
09.04.2011

  • Помимо замены -f позиционным аргументом, я бы сделал compare и verify двумя подкомандами, а не парой взаимоисключающих обязательных параметров. (test.py compare P1 P2 output.txt и test.py verify P1 output.txt; обратите внимание, что позиционные аргументы должны быть указаны для каждого подпарсера. В качестве альтернативы, сделайте -f параметром, который по умолчанию используется для стандартного вывода; вы можете оставить параметры основного анализатора, чтобы они применялись независимо от того, какая подкоманда задана). 22.11.2013

Ответы:


1

Какой именно результат вы ищете? Мне неизвестен какой-либо стандартный синтаксис для обозначения взаимной исключительности в выводе --help, и, вероятно, ваши пользователи будут сбиты с толку, если вы его придумаете. Также я предполагаю, что argparse не поддерживает синтаксис для него (поскольку, если бы это было так, он бы уже работал).

Я предлагаю вам не усложнять и просто объяснять вашим пользователям взаимное исключение в справке для каждого из аргументов. Поэтому измените их строки справки следующим образом:

-c Package1 Package2, --compare Package1 Package2
                      Compare two packages (may not be used with -v).
-v Package, --verify Package
                      Verify Content of package (may not be used with -c).

Это предельно очевидно и достаточно лаконично.

Другой альтернативой было бы просто не упоминать об этом, и пользователь обнаружил бы, что они являются взаимоисключающими, пытаясь использовать их одновременно (argparse автоматически генерирует удобную для пользователя ошибку, такую ​​​​как «PROG: error: argument -c: not allowed with argument -v»).

09.04.2011
  • после недельного ожидания не получил правильного ответа Ваш ответ кажется наиболее практичным. Похоже, другого технического способа решения нет. 13.04.2011

  • 2

    Установите имя файла как позиционный аргумент, и пусть argparse установит собственное сообщение об использовании:

    $ python so.py --help
    usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName
    

    Имя файла должно быть позиционным, и вы должны позволить argparse написать собственное сообщение об использовании.

    Код

    #!/usr/bin/python
    
    import sys
    import argparse
    
    def main():
        description='Package Compare/Verifier tool.'
        parser = argparse.ArgumentParser(description=description,
                                         epilog='--compare and --verify are mutually exclusive')
    
        parser.add_argument('f',action='store',nargs=1,
                            help='File Name where result is stored.',
                            metavar="outFileName")
    
        group = parser.add_mutually_exclusive_group(required=False)
        group.add_argument('-c','--compare',action='store',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
        group.add_argument('-v','--verify',action='store',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
    
        args = parser.parse_args()
    
    if __name__ == "__main__":
        main()
    

    Справочное сообщение

    $ python so.py --help
    usage: so.py [-h] [-c Package1 Package2 | -v Package] outFileName
    
    Package Compare/Verifier tool.
    
    positional arguments:
      outFileName           File Name where result is stored.
    
    optional arguments:
      -h, --help            show this help message and exit
      -c Package1 Package2, --compare Package1 Package2
                            Compare two packages.
      -v Package, --verify Package
                            Verify Content of package.
    
    --compare and --verify are mutually exclusive
    
    09.04.2011
  • Это было близко, но технически мне нужно -f из необязательных аргументов в файле справки. Поскольку необязательные аргументы заголовка: вводят в заблуждение, когда -f является обязательным аргументом. 09.04.2011
  • Обновлен мой ответ, файл теперь является позиционным аргументом. 09.04.2011
  • @Matan, но с измененным кодом - python so.py out.txt работает. Что неверно - так как -c/-v (один из них должен присутствовать). 09.04.2011
  • если вы установите required=True, это решит проблему? 13.04.2013

  • 3

    Я думаю, что основная жалоба связана с именами групп по умолчанию positional arguments и optional arguements. В help, optional arguments означает: requires a flag like -f or --file; positional arguments означает it is identified by position. Со значениями по умолчанию positionals действительно обязательны, а optionals действительно необязательны (не обязательны). Но пользователь может изменить это с помощью атрибута required, что приведет к путанице в терминологии.

    Обойти это можно, задав собственные группы аргументов. Эти группы влияют на макет help, но не влияют на синтаксический анализ. Они также не влияют на строку usage.

    def main():
        description='Package Compare/Verifier tool.'
        parser = argparse.ArgumentParser(usage=None,description=description)
    
        maingroup = parser.add_argument_group(title='required')
        maingroup.add_argument('-f','--file',nargs=1,dest='outFileName',help='File Name where result is stored.',metavar="outFileName",required=True)
        exgroup = parser.add_argument_group(title='one or the other')
    
        group = exgroup.add_mutually_exclusive_group(required=True)
        group.add_argument('-c','--compare',nargs=2,dest='packageInfo',help='Compare two packages.',metavar=("Package1","Package2"))
        group.add_argument('-v','--verify',nargs=1,dest='packageName',help='Verify Content of package.',metavar='Package')
        args = parser.parse_args()
    

    производит:

    usage: stack5603364.py [-h] -f outFileName (-c Package1 Package2 | -v Package)
    
    Package Compare/Verifier tool.
    
    optional arguments:
      -h, --help            show this help message and exit
    
    required:
      -f outFileName, --file outFileName
                            File Name where result is stored.
    
    one or the other:
      -c Package1 Package2, --compare Package1 Package2
                            Compare two packages.
      -v Package, --verify Package
                            Verify Content of package.
    

    mutually_exclusive_group влияет только на строку usage.

    (-c Package1 Package2 | -v Package)
    

    отображает группу, в которой требуется один из вариантов.

    [-c Package1 Package2 | -v Package]
    

    будет необязательной группой. [] используются для обозначения необязательных (не обязательных) аргументов. Обратите внимание, как -h продолжает обозначаться.

    http://bugs.python.org/issue9694 – связанная проблема с Python, автор argparse поддерживает эту argument_group подход.

    22.11.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..