Skip to content

Commit fb362be

Browse files
committed
fix(argparse): raise error when BooleanOptionalAction used with prefix_chars without '-'
1 parent fc0305a commit fb362be

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

Lib/argparse.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -954,6 +954,9 @@ def __init__(self,
954954

955955

956956
def __call__(self, parser, namespace, values, option_string=None):
957+
if '-' not in parser.prefix_chars:
958+
raise ValueError("BooleanOptionalAction requires '-' in parser's prefix_chars")
959+
957960
if option_string in self.option_strings:
958961
setattr(namespace, self.dest, not option_string.startswith('--no-'))
959962

Lib/test/test_argparse.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,16 @@ def test_invalid_name(self):
795795
self.assertEqual(str(cm.exception),
796796
"invalid option name '--no-foo' for BooleanOptionalAction")
797797

798+
def test_prefix_chars_incompatibility(self):
799+
parser = argparse.ArgumentParser(prefix_chars='+')
800+
parser.add_argument('++foo', action=argparse.BooleanOptionalAction)
801+
802+
with self.assertRaises(ValueError) as cm:
803+
parser.parse_args(['++foo'])
804+
805+
self.assertIn(str(cm.exception),
806+
"BooleanOptionalAction requires '-' in parser's prefix_chars")
807+
798808
class TestBooleanOptionalActionRequired(ParserTestCase):
799809
"""Tests BooleanOptionalAction required"""
800810

0 commit comments

Comments
 (0)