Одна из распространенных проблем, с которой сталкиваются разработчики на Python, связана с разбором булевых значений из командной строки с помощью библиотеки argparse. Допустим, есть необходимость запуска программы с булевыми флагами командной строки.
python my_program.py --my_boolean_flag False
При попытке использовать argparse для разбора этих значений могут возникнуть проблемы. Вот типичный пример кода:
import argparse parser = argparse.ArgumentParser(description="My parser") parser.add_argument("--my_bool", type=bool) cmd_line = ["--my_bool", "False"] parsed_args = parser.parse_args(cmd_line)
В этом случае, несмотря на то, что в командной строке указано значение «False», parsed_args.my_bool
будет равно True
. Это происходит из-за того, что любая непустая строка в Python воспринимается как True
. Таким образом, «False» преобразуется в True
.
Чтобы корректно обрабатывать булевые значения с помощью argparse, можно воспользоваться следующим решением:
import argparse def str2bool(v): if isinstance(v, bool): return v if v.lower() in ('yes', 'true', 't', 'y', '1'): return True elif v.lower() in ('no', 'false', 'f', 'n', '0'): return False else: raise argparse.ArgumentTypeError('Boolean value expected.') parser = argparse.ArgumentParser() parser.add_argument('--my_bool', type=str2bool)
В этом примере функция str2bool
преобразует строковое представление булевых значений в соответствующие булевые значения. Если значение не может быть интерпретировано как булево, то возникает ошибка. Эта функция используется в качестве типа для аргумента --my_bool
, что позволяет корректно обрабатывать булевые значения, переданные через командную строку.
Это решение позволяет обрабатывать все стандартные представления булевых значений, включая «True», «False», «T», «F» и их варианты в нижнем регистре.
Добавить комментарий