python: ошибка выдачи значения argparse при объединении позиционного и необязательного аргумента

Я пытаюсь использовать библиотеку argparse в python для чтения необязательных и обязательных аргументов. Пока делаю так:

import argparse
parser = argparse.ArgumentParser(description='Cleanup Script for Folder')

parser.add_argument('PATH_TO_WORKDIR_ROOT', type=str, dest='PATH_TO_WORKDIR_ROOT', action='store', help='(absolute or) relative path to directory \n   to work on, e.g. "..\MyFolder\\"')
parser.add_argument('--PATH_TO_BACKUP_ROOT', type=str, dest='PATH_TO_BACKUP_ROOT', action='store', help='(absolute or) relative path to Backup-Directory \n   default is ".\BACKUP\"')

args = parser.parse_args()

Сейчас я тестирую свой код, и он дает мне ошибку значения, которую я не понимаю:

$ python argparsetest.py --help
Traceback (most recent call last):  
File "argparsetest.py", line 5, in <module>
    parser.add_argument('PATH_TO_WORKDIR_ROOT', type=str, dest='PATH_TO_WORKDIR_ ROOT', action='store', help='(absolute or)
relative path to directory \n   to wo rk on, e.g. "..\MyFolder\\"')  
File "C:\Program
Files\Enthought\Canopy\App\appdata\canopy-1.3.0.1715.win-x86_
64\lib\argparse.py", line 1262, in add_argument
    raise ValueError('dest supplied twice for positional argument') ValueError: dest supplied twice for positional argument

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

Заранее большое спасибо!


person Mischa Obrecht    schedule 03.01.2017    source источник
comment
Попробуйте добавить -- в PATH_TO_WORKDIR_ROOT, например --PATH_TO_WORKDIR_ROOT   -  person Siva Cn    schedule 03.01.2017
comment
Ошибка полностью относится к 1-му add_argument методу. Первая строка - это dest, и вам не разрешено снова определять ее с помощью параметра ключевого слова. docs.python.org/3/library/argparse.html#dest   -  person hpaulj    schedule 03.01.2017


Ответы (1)


Посмотрите на следующий код в argparse.py:

# =======================
# Adding argument actions
# =======================
def add_argument(self, *args, **kwargs):
    """
    add_argument(dest, ..., name=value, ...)
    add_argument(option_string, option_string, ..., name=value, ...)
    """

    # if no positional args are supplied or only one is supplied and
    # it doesn't look like an option string, parse a positional
    # argument
    chars = self.prefix_chars
    if not args or len(args) == 1 and args[0][0] not in chars:
        if args and 'dest' in kwargs:
            raise ValueError('dest supplied twice for positional argument')
        kwargs = self._get_positional_kwargs(*args, **kwargs)

Поскольку вы не предшествовали -- PATH_TO_WORKDIR_ROOT, он считает, что первым аргументом является dest, поэтому возникает ошибка, когда вы снова указываете dest в качестве именованного аргумента.

person MotKohn    schedule 03.01.2017
comment
Спасибо за ответ, это помогло! - person Mischa Obrecht; 04.01.2017