Я хотел бы использовать argparse для разбора логических аргументов командной строки, написанных как «--foo True» или «--foo False». Например:
my_program --my_boolean_flag False
Однако следующий тестовый код не делает то, что я хотел бы:
import argparse
parser = argparse.ArgumentParser(description="My parser")
parser.add_argument("--my_bool", type=bool)
cmd_line = ["--my_bool", "False"]
parsed_args = parser.parse(cmd_line)
К сожалению, parsed_args.my_bool
оценивает True
. Это имеет место даже тогда, когда я изменяюсь, чтобы cmd_line
быть ["--my_bool", ""]
, что удивительно, так как bool("")
оценивает в False
.
Как я могу получить argparse разобрать "False"
, "F"
и их строчные варианты быть False
?
python
boolean
argparse
command-line-parsing
SuperElectric
источник
источник
parser.add_argument('--feature', dest='feature', default=False, action='store_true')
. Это решение гарантирует, что вы всегда получитеbool
тип со значениемTrue
илиFalse
. (У этого решения есть ограничение: ваш вариант должен иметь значение по умолчанию.)parser.add_argument('--feature', dest='feature', type=lambda x:bool(distutils.util.strtobool(x)))
. Когда опция используется, это решение обеспечитbool
тип со значениемTrue
илиFalse
. Когда опция не используется, вы получитеNone
. (distutils.util.strtobool(x)
из другого вопроса stackoverflow )parser.add_argument('--my_bool', action='store_true', default=False)
Ответы:
Еще одно решение с использованием предыдущих предложений, но с «правильной» ошибкой разбора
argparse
:Это очень полезно для переключения со значениями по умолчанию; например
позволяет мне использовать:
и по-прежнему использовать значение по умолчанию (специфично для пользовательских настроек). Один (косвенно связанный) недостаток этого подхода заключается в том, что «nargs» может поймать позиционный аргумент - см. Этот связанный вопрос и этот отчет об ошибке argparse .
источник
str2bool(v)
может быть заменен наbool(distutils.util.strtobool(v))
. Источник: stackoverflow.com/a/18472142/2436175if args.nice:
beacuse, если для аргумента установлено значение False, условие никогда не пройдет. Если это так , то , может быть , лучше вернуться список изstr2bool
функции и множества списка в качествеconst
параметра, как это[True]
,[False]
. Поправь меня, если я ошибаюсьЯ думаю, что более канонический способ сделать это через:
а также
argparse
поддерживает эту версию красиво:Конечно, если вам действительно нужна
--arg <True|False>
версия, вы можете передать ееast.literal_eval
как «тип» или пользовательскую функцию ...источник
type=bool
должно работать из коробки (рассмотрим позиционные аргументы!). Даже если вы дополнительно укажетеchoices=[False,True]
, вы получите «False» и «True», считающиеся True (из-за преобразования типа string в bool?). Возможно связанный вопросbool()
должна делать функция Python или в чем должен принимать argparsetype=fn
? Всеargparse
проверки это то, чтоfn
можно вызвать. Ожидается, что он получитfn
один строковый аргумент и вернет значение. Поведениеfn
- это ответственность программиста, а неargparse's
.Я рекомендую ответ mgilson, но с взаимоисключающей группой,
чтобы вы не могли использовать
--feature
и--no-feature
в то же время.а также
но нет
Автор сценария:
Затем вы можете использовать этот помощник, если вы собираетесь установить многие из них:
источник
add_argument
вызывается сdest='feature'
.set_defaults
называется сfeature=True
. Понимаю?--flag False
, часть ответов СО должна касаться того, ЧТО они пытаются решить, а не только КАК. Там не должно быть абсолютно никаких оснований делать--flag False
или ,--other-flag True
а затем использовать некоторые пользовательские парсер , чтобы преобразовать строку в булево ..action='store_true'
иaction='store_false'
лучшие способы использовать булевы флаги... can be “don’t do that”, but it should also include “try this instead”
который (по крайней мере для меня) подразумевает ответы, должен идти глубже, когда это необходимо. Определенно бывают случаи, когда некоторые из нас, публикующих вопросы, могут извлечь пользу из руководства по лучшим / лучшим практикам и т. Д. Ответы «как указано» часто не делают этого. При этом ваше разочарование в связи с ответами, которые часто предполагают, что слишком много (или неправильно) полностью обоснованно.parser.set_defaults(feature=None)
help=
запись для этого аргумента, куда он должен идти? Вadd_mutually_exclusive_group()
вызове? В одном или обоихadd_argument()
звонках? Где-нибудь еще?Вот еще один вариант без дополнительных строк / с для установки значений по умолчанию. Для bool всегда присваивается значение, так что его можно использовать в логических выражениях без предварительной проверки.
источник
required=True
иначе вы всегда получите истинный аргумент.python3 test.py --do-something False
не удаетсяerror: unrecognized arguments: False
, поэтому он не дает ответа на вопрос.один лайнер:
источник
type=lambda x: (str(x).lower() in ['true','1', 'yes'])
Кажется, есть некоторая путаница относительно того, что
type=bool
и чтоtype='bool'
может значить. Должен ли один (или оба) означать «запустить функциюbool()
или« вернуть логическое значение »? Как оно стоит,type='bool'
ничего не значит.add_argument
выдает'bool' is not callable
ошибку, так же, как если бы вы использовалиtype='foobar'
, илиtype='int'
.Но
argparse
есть реестр, который позволяет вам определять ключевые слова, как это. В основном используется дляaction
, например, `action = 'store_true'. Вы можете увидеть зарегистрированные ключевые слова с:который отображает словарь
Определено множество действий, но только один тип, по умолчанию,
argparse.identity
.Этот код определяет ключевое слово 'bool':
parser.register()
не задокументировано, но и не скрыто. По большей части программист не должен знать об этом , потому чтоtype
иaction
функции принимают и классовые ценности. Существует множество примеров стекового потока для определения пользовательских значений для обоих.В случае, если это не очевидно из предыдущего обсуждения,
bool()
это не означает «разобрать строку». Из документации Python:Сравните это с
источник
Я искал ту же проблему, и мне кажется, красивое решение:
и используя это для разбора строки на логическое значение, как предложено выше.
источник
distutils.util.strtobool(v)
.distutils.util.strtobool
возвращает 1 или 0, а не фактическое логическое.Очень похожим способом является использование:
и если вы установите аргумент --feature в вашей команде
аргумент будет True, если вы не установите тип --feature аргументы по умолчанию всегда False!
источник
--feature False
В дополнение к тому, что сказал @mgilson, следует отметить, что есть также
ArgumentParser.add_mutually_exclusive_group(required=False)
метод, который сделал бы его тривиальным--flag
и--no-flag
не использовался одновременно.источник
Это работает для всего, что я ожидаю:
Код:
источник
_str_to_bool(s)
преобразоватьs = s.lower()
один раз, то испытаниеif s not in {'true', 'false', '1', '0'}
, и , наконецreturn s in {'true', '1'}
.Более простым способом было бы использовать, как показано ниже.
источник
Простейшие. Это не гибко, но я предпочитаю простоту.
РЕДАКТИРОВАТЬ: Если вы не доверяете вводу, не используйте
eval
.источник
eval
это встроенная функция. docs.python.org/3/library/functions.html#eval Это может быть любая унарная функция, которой могут воспользоваться другие, более гибкие подходы.Простейшим способом было бы использовать выбор :
Не передавая --my-flag, оценивается как False. Параметр required = True может быть добавлен, если вы всегда хотите, чтобы пользователь явно указал выбор.
источник
Я думаю, что самый канонический путь будет:
источник
источник
Самый простой и правильный способ
Обратите внимание, что Истинными значениями являются y, да, t, true, on и 1; ложными значениями являются n, no, f, false, off и 0. Поднимает ValueError, если val - что-то еще.
источник
Быстро и просто, но только для аргументов 0 или 1:
Вывод будет «Ложь» после вызова с терминала:
источник
Похоже на @Akash, но вот другой подход, который я использовал. Он использует
str
неlambda
потому, что питонlambda
всегда вызывает у меня чувство инопланетянина.источник
В качестве улучшения ответа @Akash Desarda, вы можете сделать
И это поддерживает
python test.py --foo
источник