Argparse — как разобрать второй аргумент, если первый не введен и вернуться к умолчанию

У меня есть функция ниже как часть сканера каталогов:

def get_args():
    cwd = os.getcwd()
    parser = argparse.ArgumentParser(description='Scan all files')
    parser.add_argument("path", help = "Path to folder", nargs='?', default=cwd)
    parser.add_argument("print", help = "Print file extensions", nargs='?', default=False)
    return parser.parse_args()


Scan /usr/Ari True

Это отсканирует указанную папку и распечатает список

Scan

Будет сканировать текущий рабочий каталог, в котором я нахожусь в терминале

Scan True

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

Argparse — как разобрать второй аргумент, если первый не введен и вернуться к умолчанию

path получает первую строку, если она есть. print получает строку, только если указано 2. argparse не может «знать», что «Истина» предназначена для второго позиционного аргумента. Почему вы не используете --print' с store_true?
hpaulj 10.04.2019 04:43

Вы понимаете, что по определению print будет False логическим значением или строкой, а не True логическим значением?

hpaulj 10.04.2019 04:44

@hpaulj Да, я не хочу, чтобы он что-либо печатал, пока я не скажу «Истина». Поэтому, если бы я хотел напечатать, я бы написал Scan /some/directory True, тогда он напечатает более подробный результат. Если оставить значение False по умолчанию, будет напечатано только минимальное количество. Это работает, поверьте мне. Моя проблема передает второй аргумент, когда он ожидает два.

Steve 10.04.2019 05:20

Вы можете посмотреть на args.path. Если это «Истина», а не путь, подобный строке, тогда предположим, что ваш пользователь хочет использовать путь по умолчанию. Но зачем вообще использовать argparse. Просто посмотрите на sys.argv[1:].

hpaulj 10.04.2019 08:01

Как правило, использовать несколько positionals с ?' (or '*+') наргами — не лучшая идея. Первый аргумент жадный, поэтому у вас нет хорошего контроля над их назначением. Он присваивает значения по положению, а не по значению. Используйте отмеченные опции, если вы хотите больше контроля. Или сделайте свой разбор.

hpaulj 12.04.2019 02:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
267
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отвечать:

    def get_args():
        cwd = os.getcwd()
        parser = argparse.ArgumentParser(description='ScanDirecotry.py --path <path> --print (remove --print if you dont want to print.)')
        parser.add_argument("--path", help = "Path to folder", default=cwd)
        parser.add_argument("--print", help = "Print file extensions", action='store_true')
        return parser.parse_args()

Другие вопросы по теме