Issue #22423: Fixed debugging output of the GROUPREF_EXISTS opcode in the re
module.
diff --git a/Lib/sre_parse.py b/Lib/sre_parse.py
index 0a361ab..b85ce88 100644
--- a/Lib/sre_parse.py
+++ b/Lib/sre_parse.py
@@ -94,33 +94,42 @@
self.data = data
self.width = None
def dump(self, level=0):
- nl = 1
- seqtypes = type(()), type([])
+ seqtypes = (tuple, list)
for op, av in self.data:
- print level*" " + op,; nl = 0
- if op == "in":
+ print level*" " + op,
+ if op == IN:
# member sublanguage
- print; nl = 1
+ print
for op, a in av:
print (level+1)*" " + op, a
- elif op == "branch":
- print; nl = 1
- i = 0
- for a in av[1]:
- if i > 0:
+ elif op == BRANCH:
+ print
+ for i, a in enumerate(av[1]):
+ if i:
print level*" " + "or"
- a.dump(level+1); nl = 1
- i = i + 1
- elif type(av) in seqtypes:
+ a.dump(level+1)
+ elif op == GROUPREF_EXISTS:
+ condgroup, item_yes, item_no = av
+ print condgroup
+ item_yes.dump(level+1)
+ if item_no:
+ print level*" " + "else"
+ item_no.dump(level+1)
+ elif isinstance(av, seqtypes):
+ nl = 0
for a in av:
if isinstance(a, SubPattern):
- if not nl: print
- a.dump(level+1); nl = 1
+ if not nl:
+ print
+ a.dump(level+1)
+ nl = 1
else:
- print a, ; nl = 0
+ print a,
+ nl = 0
+ if not nl:
+ print
else:
- print av, ; nl = 0
- if not nl: print
+ print av
def __repr__(self):
return repr(self.data)
def __len__(self):
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index 88eafc9..7bdf353 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -930,16 +930,33 @@
self.assertEqual(m.group(2), "y")
def test_debug_flag(self):
+ pat = r'(\.)(?:[ch]|py)(?(1)$|: )'
with captured_stdout() as out:
- re.compile('foo', re.DEBUG)
- self.assertEqual(out.getvalue().splitlines(),
- ['literal 102', 'literal 111', 'literal 111'])
+ re.compile(pat, re.DEBUG)
+ dump = '''\
+subpattern 1
+ literal 46
+subpattern None
+ branch
+ in
+ literal 99
+ literal 104
+ or
+ literal 112
+ literal 121
+subpattern None
+ groupref_exists 1
+ at at_end
+ else
+ literal 58
+ literal 32
+'''
+ self.assertEqual(out.getvalue(), dump)
# Debug output is output again even a second time (bypassing
# the cache -- issue #20426).
with captured_stdout() as out:
- re.compile('foo', re.DEBUG)
- self.assertEqual(out.getvalue().splitlines(),
- ['literal 102', 'literal 111', 'literal 111'])
+ re.compile(pat, re.DEBUG)
+ self.assertEqual(out.getvalue(), dump)
def test_keyword_parameters(self):
# Issue #20283: Accepting the string keyword parameter.