{"record":{"id":"3a3f0a3778b54ba4","repo":"python/cpython","slug":"invalid-option-name-option-string-r-for-booleano","errorCode":null,"errorMessage":"invalid option name {option_string!r} for BooleanOptionalAction","messagePattern":"invalid option name (.+?) for BooleanOptionalAction","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Lib/argparse.py","lineNumber":1063,"sourceCode":"\nclass BooleanOptionalAction(Action):\n    def __init__(self,\n                 option_strings,\n                 dest,\n                 default=None,\n                 required=False,\n                 help=None,\n                 deprecated=False):\n\n        _option_strings = []\n        neg_option_strings = []\n        for option_string in option_strings:\n            _option_strings.append(option_string)\n\n            if len(option_string) > 2 and option_string[0] == option_string[1]:\n                # two-dash long option: '--foo' -> '--no-foo'\n                if option_string.startswith('no-', 2):\n                    raise ValueError(f'invalid option name {option_string!r} '\n                                     f'for BooleanOptionalAction')\n                option_string = option_string[:2] + 'no-' + option_string[2:]\n                _option_strings.append(option_string)\n                neg_option_strings.append(option_string)\n            elif len(option_string) > 2 and option_string[0] != option_string[1]:\n                # single-dash long option: '-foo' -> '-nofoo'\n                if option_string.startswith('no', 1):\n                    raise ValueError(f'invalid option name {option_string!r} '\n                                     f'for BooleanOptionalAction')\n                option_string = option_string[:1] + 'no' + option_string[1:]\n                _option_strings.append(option_string)\n                neg_option_strings.append(option_string)\n\n        super().__init__(\n            option_strings=_option_strings,\n            dest=dest,\n            nargs=0,\n            default=default,","sourceCodeStart":1045,"sourceCodeEnd":1081,"githubUrl":"https://github.com/python/cpython/blob/bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6/Lib/argparse.py#L1045-L1081","documentation":"BooleanOptionalAction auto-generates a negated form for each option ('--foo' -> '--no-foo'). For two-dash options it refuses names that already start with 'no-' after the dashes ('--no-x'), because the generated negative would collide or be nonsensical ('--no-no-x'). The ValueError is raised at construction time, i.e. when the parser is built.","triggerScenarios":"parser.add_argument('--no-cache', action=argparse.BooleanOptionalAction); any long option string beginning '--no-'; programmatically prefixed option names from a config loop.","commonSituations":"Teams naming flags with a built-in negative ('--no-color', '--no-cache') and then adding BooleanOptionalAction for it; wrapping existing negated flags with the new action during a CLI modernization.","solutions":["Drop the 'no-' prefix and let the action generate it: add_argument('--cache', action=BooleanOptionalAction) gives --cache/--no-cache.","If the flag must keep its literal name, use a plain store_true/store_false action instead.","Strip 'no-' prefixes when generating options from config keys before passing them to add_argument."],"exampleFix":"# before\nparser.add_argument('--no-cache', action=argparse.BooleanOptionalAction)  # ValueError at parser build\n\n# after\nparser.add_argument('--cache', action=argparse.BooleanOptionalAction)  # provides --cache and --no-cache","handlingStrategy":"validation","validationCode":"def ok_boolean_option_name(name: str) -> bool:\n    if name.startswith('--'):\n        return not name.startswith('--no-')\n    return True","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Name positive flags without the 'no-' prefix; BooleanOptionalAction generates the negative","Validate generated option names before add_argument","Keep legacy negated flags on store_true instead of BooleanOptionalAction"],"tags":["python","argparse","cli","boolean-optional-action","option-naming"],"backgroundTag":null,"analyzedSha":"bc6749cc3b5ae4a5e88a6cc2d5b3bebbe354eae6","analyzedAt":"2026-08-14T22:01:13.976Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}