Argparse не разбирает логические аргументы? - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь сделать скрипт сборки следующим образом:

import glob
import os
import subprocess
import re
import argparse
import shutil

def create_parser():
    parser = argparse.ArgumentParser(description='Build project')

    parser.add_argument('--clean_logs', type=bool, default=True,
                        help='If true, old debug logs will be deleted.')

    parser.add_argument('--run', type=bool, default=True,
                        help="If true, executable will run after compilation.")

    parser.add_argument('--clean_build', type=bool, default=False,
                        help="If true, all generated files will be deleted and the"
                        " directory will be reset to a pristine condition.")

    return parser.parse_args()


def main():
    parser = create_parser()
    print(parser)

Однако, как бы я ни пытался передать аргумент, я получаю только значения по умолчанию. Я всегда получаю Namespace(clean_build=False, clean_logs=True, run=True).

Я пробовал:

python3 build.py --run False
python3 build.py --run=FALSE
python3 build.py --run FALSE
python3 build.py --run=False
python3 build.py --run false
python3 build.py --run 'False'

Это всегда одно и то же. Чего мне не хватает?

1 Ответ

2 голосов
/ 02 апреля 2020

Вы неправильно понимаете, как argparse понимает логические аргументы.

В основном вам следует использовать action='store_true' или action='store_false' вместо значения по умолчанию, с пониманием, что отсутствие указания аргумента даст вам обратное действие, например,

parser.add_argument('-x', type=bool, action='store_true')

приведет к тому, что

python3 command -x

будет иметь x, установленный на True, и

python3 command

, чтобы иметь x установлен на False.

В то время как action=store_false сделает противоположное.


Установка bool для типа не ведет себя так, как вы ожидаете, и это известная проблема .

Причина текущего поведения заключается в том, что type должен вызываться как argument = type(argument). bool('False') оценивается как True, поэтому вам нужно установить другое type для ожидаемого поведения.

...