Skip to content

Commit e1d4823

Browse files
authored
gh-145650: Add logging.{Formatter,Filter}.__repr__ (GH-145652)
1 parent 3a2b81e commit e1d4823

File tree

3 files changed

+37
-0
lines changed

3 files changed

+37
-0
lines changed

Lib/logging/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,9 @@ def __init__(self, fmt=None, datefmt=None, style='%', validate=True, *,
622622
self._fmt = self._style._fmt
623623
self.datefmt = datefmt
624624

625+
def __repr__(self):
626+
return '<%s (%s)>' % (self.__class__.__name__, self._fmt)
627+
625628
default_time_format = '%Y-%m-%d %H:%M:%S'
626629
default_msec_format = '%s,%03d'
627630

@@ -794,6 +797,9 @@ def __init__(self, name=''):
794797
self.name = name
795798
self.nlen = len(name)
796799

800+
def __repr__(self):
801+
return '<%s (%s)>' % (self.__class__.__name__, self.name)
802+
797803
def filter(self, record):
798804
"""
799805
Determine if the specified record is to be logged.

Lib/test/test_logging.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,20 @@ def test_empty_filter(self):
404404
r = logging.makeLogRecord({'name': 'spam.eggs'})
405405
self.assertTrue(f.filter(r))
406406

407+
def test_filter_repr(self):
408+
f = logging.Filter('myapp')
409+
self.assertEqual(repr(f), '<Filter (myapp)>')
410+
411+
def test_filter_repr_empty(self):
412+
f = logging.Filter()
413+
self.assertEqual(repr(f), '<Filter ()>')
414+
415+
def test_filter_repr_subclass(self):
416+
class MyFilter(logging.Filter):
417+
pass
418+
f = MyFilter('myapp')
419+
self.assertEqual(repr(f), '<MyFilter (myapp)>')
420+
407421
#
408422
# First, we define our levels. There can be as many as you want - the only
409423
# limitations are that they should be integers, the lowest should be > 0 and
@@ -4914,6 +4928,20 @@ def test_relativeCreated_has_higher_precision(self):
49144928
# After PR gh-102412, precision (places) increases from 3 to 7
49154929
self.assertAlmostEqual(relativeCreated, offset_ns / 1e6, places=7)
49164930

4931+
def test_formatter_repr(self):
4932+
f = logging.Formatter('%(message)s')
4933+
self.assertEqual(repr(f), '<Formatter (%(message)s)>')
4934+
4935+
def test_formatter_repr_default(self):
4936+
f = logging.Formatter()
4937+
self.assertEqual(repr(f), '<Formatter (%(message)s)>')
4938+
4939+
def test_formatter_repr_subclass(self):
4940+
class MyFormatter(logging.Formatter):
4941+
pass
4942+
f = MyFormatter('%(message)s')
4943+
self.assertEqual(repr(f), '<MyFormatter (%(message)s)>')
4944+
49174945

49184946
class TestBufferingFormatter(logging.BufferingFormatter):
49194947
def formatHeader(self, records):
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Add :meth:`~object.__repr__` support to :class:`logging.Formatter` and
2+
:class:`logging.Filter`, showing the format string and filter name
3+
respectively.

0 commit comments

Comments
 (0)