From de38361383bc9eaf6b9b1235df1c6316ed31aa30 Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 12:24:55 -0400 Subject: [PATCH 1/6] bpo-37101: Improve readability of Filterer.filter(...) with efficient built-ins. https://bugs.python.org/issue37101 --- Lib/logging/__init__.py | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 16812ec8d55678..e4eac36a6c17a7 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -789,6 +789,15 @@ def removeFilter(self, filter): if filter in self.filters: self.filters.remove(filter) + @staticmethod + def _filter_callable(filter): + """ + Returns a predicate, based on the given object. + + Uses 'filter' attribute if present, else returns the given object. + """ + return filter.filter if hasattr(filter, 'filter') else filter + def filter(self, record): """ Determine if a record is loggable by consulting all the filters. @@ -800,17 +809,14 @@ def filter(self, record): .. versionchanged:: 3.2 Allow filters to be just callables. + + .. versionchanged: 3.9 + + Improve readability using efficient Python 3 builtins. """ - rv = True - for f in self.filters: - if hasattr(f, 'filter'): - result = f.filter(record) - else: - result = f(record) # assume callable - will raise if not - if not result: - rv = False - break - return rv + filters = map(self._filter_callable, self.filters) + return all(f(record) for f in filters) # assume callable - will raise if not + #--------------------------------------------------------------------------- # Handler classes and functions From cab4226e088341496197453de5cabd4e16d162e6 Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 13:03:08 -0400 Subject: [PATCH 2/6] bpo-37101: Added needed news blurb for changes. --- .../NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst diff --git a/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst b/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst new file mode 100644 index 00000000000000..a367456f5be21b --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst @@ -0,0 +1 @@ +Modified logging.Filterer.filter() to use efficient, readable built-ins. From be78c9c44f5f96d383d2bb41732dd70d5e7a60d8 Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 13:15:34 -0400 Subject: [PATCH 3/6] bpo-37101: Further simplification using getattr. Thanks @zach.ware! --- Lib/logging/__init__.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index e4eac36a6c17a7..a5cd49706324c2 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -789,15 +789,6 @@ def removeFilter(self, filter): if filter in self.filters: self.filters.remove(filter) - @staticmethod - def _filter_callable(filter): - """ - Returns a predicate, based on the given object. - - Uses 'filter' attribute if present, else returns the given object. - """ - return filter.filter if hasattr(filter, 'filter') else filter - def filter(self, record): """ Determine if a record is loggable by consulting all the filters. @@ -814,7 +805,7 @@ def filter(self, record): Improve readability using efficient Python 3 builtins. """ - filters = map(self._filter_callable, self.filters) + filters = (getattr(f, 'filter', f) for f in self.filters) return all(f(record) for f in filters) # assume callable - will raise if not From 8c7dc0e15dd405920ba934ff1ae33881a99321d4 Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 14:33:42 -0400 Subject: [PATCH 4/6] cbo-37101: Changelog comment versionchanged correction 3.9 -> 3.8 --- Lib/logging/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index a5cd49706324c2..0665782e7d9f1e 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -801,7 +801,7 @@ def filter(self, record): Allow filters to be just callables. - .. versionchanged: 3.9 + .. versionchanged: 3.8 Improve readability using efficient Python 3 builtins. """ From f903dbdd957521a84ae2fe1cb62627a6014ec18b Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 14:37:14 -0400 Subject: [PATCH 5/6] cbo-37101: Removing unnecessary change comment. --- Lib/logging/__init__.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py index 0665782e7d9f1e..5e044084751bc3 100644 --- a/Lib/logging/__init__.py +++ b/Lib/logging/__init__.py @@ -800,10 +800,6 @@ def filter(self, record): .. versionchanged:: 3.2 Allow filters to be just callables. - - .. versionchanged: 3.8 - - Improve readability using efficient Python 3 builtins. """ filters = (getattr(f, 'filter', f) for f in self.filters) return all(f(record) for f in filters) # assume callable - will raise if not From 6fb489c8fd976b9872fc7a6b1dd1e0628d854763 Mon Sep 17 00:00:00 2001 From: Dale Visser Date: Thu, 30 May 2019 15:12:37 -0400 Subject: [PATCH 6/6] bpo-37101: More standard blurb message. --- .../next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst b/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst index a367456f5be21b..3df7eac6602cc3 100644 --- a/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst +++ b/Misc/NEWS.d/next/Library/2019-05-30-13-02-31.bpo-37101.pJ8FSq.rst @@ -1 +1 @@ -Modified logging.Filterer.filter() to use efficient, readable built-ins. +Improved the efficiency of :mod:`logging` record filtering.