summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSavannah Ostrowski <savannahostrowski@gmail.com>2024-10-09 21:56:50 (GMT)
committerGitHub <noreply@github.com>2024-10-09 21:56:50 (GMT)
commit0c5a48c1c9039eb1ce25a96c43505c4de0a0b9d7 (patch)
tree11601d8256c2020a602a7ab49f70ba3fabb82863 /Lib
parent52f70da19cf3c7198be37faeac233ef803080f6f (diff)
downloadcpython-0c5a48c1c9039eb1ce25a96c43505c4de0a0b9d7.zip
cpython-0c5a48c1c9039eb1ce25a96c43505c4de0a0b9d7.tar.gz
cpython-0c5a48c1c9039eb1ce25a96c43505c4de0a0b9d7.tar.bz2
GH-124693: Support parsing negative scientific and complex numbers argparse (GH-124823)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/argparse.py2
-rw-r--r--Lib/test/test_argparse.py27
2 files changed, 21 insertions, 8 deletions
diff --git a/Lib/argparse.py b/Lib/argparse.py
index 21299b6..d1f8fa2 100644
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1367,7 +1367,7 @@ class _ActionsContainer(object):
self._defaults = {}
# determines whether an "option" looks like a negative number
- self._negative_number_matcher = _re.compile(r'^-(?:\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?|\.\d+(?:_\d+)*)$')
+ self._negative_number_matcher = _re.compile(r'-\.?\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 1bf812b..c9e79eb 100644
--- a/Lib/test/test_argparse.py
+++ b/Lib/test/test_argparse.py
@@ -2195,20 +2195,33 @@ class TestNegativeNumber(ParserTestCase):
argument_signatures = [
Sig('--int', type=int),
Sig('--float', type=float),
+ Sig('--complex', type=complex),
]
failures = [
'--float -_.45',
'--float -1__000.0',
+ '--float -1.0.0',
'--int -1__000',
+ '--int -1.0',
+ '--complex -1__000.0j',
+ '--complex -1.0jj',
+ '--complex -_.45j',
]
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)),
- ('--float -.5', NS(int=None, float=-0.5)),
- ('--float -.5_000', NS(int=None, float=-0.5)),
+ ('--int -1000 --float -1000.0', NS(int=-1000, float=-1000.0, complex=None)),
+ ('--int -1_000 --float -1_000.0', NS(int=-1000, float=-1000.0, complex=None)),
+ ('--int -1_000_000 --float -1_000_000.0', NS(int=-1000000, float=-1000000.0, complex=None)),
+ ('--float -1_000.0', NS(int=None, float=-1000.0, complex=None)),
+ ('--float -1_000_000.0_0', NS(int=None, float=-1000000.0, complex=None)),
+ ('--float -.5', NS(int=None, float=-0.5, complex=None)),
+ ('--float -.5_000', NS(int=None, float=-0.5, complex=None)),
+ ('--float -1e3', NS(int=None, float=-1000, complex=None)),
+ ('--float -1e-3', NS(int=None, float=-0.001, complex=None)),
+ ('--complex -1j', NS(int=None, float=None, complex=-1j)),
+ ('--complex -1_000j', NS(int=None, float=None, complex=-1000j)),
+ ('--complex -1_000.0j', NS(int=None, float=None, complex=-1000.0j)),
+ ('--complex -1e3j', NS(int=None, float=None, complex=-1000j)),
+ ('--complex -1e-3j', NS(int=None, float=None, complex=-0.001j)),
]
class TestInvalidAction(TestCase):