From b766f3c8fe438984c6d20e7ae35108ceaf55e832 Mon Sep 17 00:00:00 2001 From: Savannah Ostrowski Date: Mon, 16 Sep 2024 23:30:17 -0700 Subject: [PATCH] GH-123945: Update regex for parsing negative numbers that contain underscores (GH-123970) --------- (cherry picked from commit 14e5bdceff45e6e789e1f838b96988946c75b0f4) Co-authored-by: Savannah Ostrowski Co-authored-by: Brandt Bucher Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com> --- Lib/argparse.py | 2 +- Lib/test/test_argparse.py | 20 +++++++++++++++++++ ...-09-11-19-05-32.gh-issue-123945.jLwybB.rst | 1 + 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Library/2024-09-11-19-05-32.gh-issue-123945.jLwybB.rst diff --git a/Lib/argparse.py b/Lib/argparse.py index bf17af0faf75e41..8f8ee68832db578 100644 --- a/Lib/argparse.py +++ b/Lib/argparse.py @@ -1388,7 +1388,7 @@ def __init__(self, self._defaults = {} # determines whether an "option" looks like a negative number - self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$') + self._negative_number_matcher = _re.compile(r'^-\d[\d_]*(\.\d[\d_]*)?$') # whether or not there are any optionals that look like negative # numbers -- uses a list so it can be shared and edited diff --git a/Lib/test/test_argparse.py b/Lib/test/test_argparse.py index b1f72a3abd46a1f..f6950727e71702d 100644 --- a/Lib/test/test_argparse.py +++ b/Lib/test/test_argparse.py @@ -2136,6 +2136,26 @@ class TestActionExtend(ParserTestCase): ] +class TestNegativeNumber(ParserTestCase): + """Test parsing negative numbers""" + + argument_signatures = [ + Sig('--int', type=int), + Sig('--float', type=float), + ] + failures = [ + '--float -_.45', + '--float -1__000.0', + '--int -1__000', + ] + successes = [ + ('--int -1000 --float -1000.0', NS(int=-1000, float=-1000.0)), + ('--int -1_000 --float -1_000.0', NS(int=-1000, float=-1000.0)), + ('--int -1_000_000 --float -1_000_000.0', NS(int=-1000000, float=-1000000.0)), + ('--float -1_000.0', NS(int=None, float=-1000.0)), + ('--float -1_000_000.0_0', NS(int=None, float=-1000000.0)), + ] + class TestInvalidAction(TestCase): """Test invalid user defined Action""" diff --git a/Misc/NEWS.d/next/Library/2024-09-11-19-05-32.gh-issue-123945.jLwybB.rst b/Misc/NEWS.d/next/Library/2024-09-11-19-05-32.gh-issue-123945.jLwybB.rst new file mode 100644 index 000000000000000..26b0ac80b1b3fd5 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2024-09-11-19-05-32.gh-issue-123945.jLwybB.rst @@ -0,0 +1 @@ +Fix a bug where :mod:`argparse` doesn't recognize negative numbers with underscores