bpo-36548: Improve the repr of re flags. (GH-12715)
This commit is contained in:
parent
65fb2c08c0
commit
14a0e16c88
48
Lib/re.py
48
Lib/re.py
|
@ -141,24 +141,40 @@ __all__ = [
|
|||
__version__ = "2.2.1"
|
||||
|
||||
class RegexFlag(enum.IntFlag):
|
||||
ASCII = sre_compile.SRE_FLAG_ASCII # assume ascii "locale"
|
||||
IGNORECASE = sre_compile.SRE_FLAG_IGNORECASE # ignore case
|
||||
LOCALE = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
|
||||
UNICODE = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale"
|
||||
MULTILINE = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
|
||||
DOTALL = sre_compile.SRE_FLAG_DOTALL # make dot match newline
|
||||
VERBOSE = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
|
||||
A = ASCII
|
||||
I = IGNORECASE
|
||||
L = LOCALE
|
||||
U = UNICODE
|
||||
M = MULTILINE
|
||||
S = DOTALL
|
||||
X = VERBOSE
|
||||
ASCII = A = sre_compile.SRE_FLAG_ASCII # assume ascii "locale"
|
||||
IGNORECASE = I = sre_compile.SRE_FLAG_IGNORECASE # ignore case
|
||||
LOCALE = L = sre_compile.SRE_FLAG_LOCALE # assume current 8-bit locale
|
||||
UNICODE = U = sre_compile.SRE_FLAG_UNICODE # assume unicode "locale"
|
||||
MULTILINE = M = sre_compile.SRE_FLAG_MULTILINE # make anchors look for newline
|
||||
DOTALL = S = sre_compile.SRE_FLAG_DOTALL # make dot match newline
|
||||
VERBOSE = X = sre_compile.SRE_FLAG_VERBOSE # ignore whitespace and comments
|
||||
# sre extensions (experimental, don't rely on these)
|
||||
TEMPLATE = sre_compile.SRE_FLAG_TEMPLATE # disable backtracking
|
||||
T = TEMPLATE
|
||||
TEMPLATE = T = sre_compile.SRE_FLAG_TEMPLATE # disable backtracking
|
||||
DEBUG = sre_compile.SRE_FLAG_DEBUG # dump pattern after compilation
|
||||
|
||||
def __repr__(self):
|
||||
if self._name_ is not None:
|
||||
return f're.{self._name_}'
|
||||
value = self._value_
|
||||
members = []
|
||||
negative = value < 0
|
||||
if negative:
|
||||
value = ~value
|
||||
for m in self.__class__:
|
||||
if value & m._value_:
|
||||
value &= ~m._value_
|
||||
members.append(f're.{m._name_}')
|
||||
if value:
|
||||
members.append(hex(value))
|
||||
res = '|'.join(members)
|
||||
if negative:
|
||||
if len(members) > 1:
|
||||
res = f'~({res})'
|
||||
else:
|
||||
res = f'~{res}'
|
||||
return res
|
||||
__str__ = object.__str__
|
||||
|
||||
globals().update(RegexFlag.__members__)
|
||||
|
||||
# sre exception
|
||||
|
|
|
@ -2170,6 +2170,18 @@ class PatternReprTests(unittest.TestCase):
|
|||
self.assertEqual(r[:30], "re.compile('Very long long lon")
|
||||
self.assertEqual(r[-16:], ", re.IGNORECASE)")
|
||||
|
||||
def test_flags_repr(self):
|
||||
self.assertEqual(repr(re.I), "re.IGNORECASE")
|
||||
self.assertEqual(repr(re.I|re.S|re.X),
|
||||
"re.IGNORECASE|re.DOTALL|re.VERBOSE")
|
||||
self.assertEqual(repr(re.I|re.S|re.X|(1<<20)),
|
||||
"re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000")
|
||||
self.assertEqual(repr(~re.I), "~re.IGNORECASE")
|
||||
self.assertEqual(repr(~(re.I|re.S|re.X)),
|
||||
"~(re.IGNORECASE|re.DOTALL|re.VERBOSE)")
|
||||
self.assertEqual(repr(~(re.I|re.S|re.X|(1<<20))),
|
||||
"~(re.IGNORECASE|re.DOTALL|re.VERBOSE|0x100000)")
|
||||
|
||||
|
||||
class ImplementationTest(unittest.TestCase):
|
||||
"""
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Improved the repr of regular expression flags.
|
Loading…
Reference in New Issue