From 769cfb81a222c842c40085723c05a8b5c853427f Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Tue, 13 Mar 2018 10:21:11 -0700 Subject: [PATCH 1/2] API: check locator and formatter args when passed --- lib/matplotlib/axis.py | 12 ++++++++++++ lib/matplotlib/tests/test_ticker.py | 24 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index b15e5af483dc..220af0f6529a 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1568,6 +1568,9 @@ def set_major_formatter(self, formatter): ACCEPTS: A :class:`~matplotlib.ticker.Formatter` instance """ + if not hasattr(formatter, 'format_data'): + raise TypeError("formatter argument should be instance of " + "matplotlib.ticker.Formatter") self.isDefault_majfmt = False self.major.formatter = formatter formatter.set_axis(self) @@ -1579,6 +1582,9 @@ def set_minor_formatter(self, formatter): ACCEPTS: A :class:`~matplotlib.ticker.Formatter` instance """ + if not hasattr(formatter, 'format_data'): + raise TypeError("formatter argument should be instance of " + "matplotlib.ticker.Formatter") self.isDefault_minfmt = False self.minor.formatter = formatter formatter.set_axis(self) @@ -1590,6 +1596,9 @@ def set_major_locator(self, locator): ACCEPTS: a :class:`~matplotlib.ticker.Locator` instance """ + if not hasattr(locator, 'tick_values'): + raise TypeError("formatter argument should be instance of " + "matplotlib.ticker.Locator") self.isDefault_majloc = False self.major.locator = locator locator.set_axis(self) @@ -1601,6 +1610,9 @@ def set_minor_locator(self, locator): ACCEPTS: a :class:`~matplotlib.ticker.Locator` instance """ + if not hasattr(locator, 'tick_values'): + raise TypeError("formatter argument should be instance of " + "matplotlib.ticker.Locator") self.isDefault_minloc = False self.minor.locator = locator locator.set_axis(self) diff --git a/lib/matplotlib/tests/test_ticker.py b/lib/matplotlib/tests/test_ticker.py index 32206a0c6168..da2227e6805f 100644 --- a/lib/matplotlib/tests/test_ticker.py +++ b/lib/matplotlib/tests/test_ticker.py @@ -728,3 +728,27 @@ def test_latex(self, is_latex, usetex, expected): fmt = mticker.PercentFormatter(symbol='\\{t}%', is_latex=is_latex) with matplotlib.rc_context(rc={'text.usetex': usetex}): assert fmt.format_pct(50, 100) == expected + + +def test_majformatter_type(): + fig, ax = plt.subplots() + with pytest.raises(TypeError): + ax.xaxis.set_major_formatter(matplotlib.ticker.LogLocator()) + + +def test_minformatter_type(): + fig, ax = plt.subplots() + with pytest.raises(TypeError): + ax.xaxis.set_minor_formatter(matplotlib.ticker.LogLocator()) + + +def test_majlocator_type(): + fig, ax = plt.subplots() + with pytest.raises(TypeError): + ax.xaxis.set_major_locator(matplotlib.ticker.LogFormatter()) + + +def test_minlocator_type(): + fig, ax = plt.subplots() + with pytest.raises(TypeError): + ax.xaxis.set_minor_locator(matplotlib.ticker.LogFormatter()) From a6651fee85f8819c56b76cb8b52d1ae234702871 Mon Sep 17 00:00:00 2001 From: Jody Klymak Date: Tue, 13 Mar 2018 19:19:20 -0700 Subject: [PATCH 2/2] FIX: back to isinstance --- lib/matplotlib/axis.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 220af0f6529a..406ae8675200 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -1568,7 +1568,7 @@ def set_major_formatter(self, formatter): ACCEPTS: A :class:`~matplotlib.ticker.Formatter` instance """ - if not hasattr(formatter, 'format_data'): + if not isinstance(formatter, mticker.Formatter): raise TypeError("formatter argument should be instance of " "matplotlib.ticker.Formatter") self.isDefault_majfmt = False @@ -1582,7 +1582,7 @@ def set_minor_formatter(self, formatter): ACCEPTS: A :class:`~matplotlib.ticker.Formatter` instance """ - if not hasattr(formatter, 'format_data'): + if not isinstance(formatter, mticker.Formatter): raise TypeError("formatter argument should be instance of " "matplotlib.ticker.Formatter") self.isDefault_minfmt = False @@ -1596,7 +1596,7 @@ def set_major_locator(self, locator): ACCEPTS: a :class:`~matplotlib.ticker.Locator` instance """ - if not hasattr(locator, 'tick_values'): + if not isinstance(locator, mticker.Locator): raise TypeError("formatter argument should be instance of " "matplotlib.ticker.Locator") self.isDefault_majloc = False @@ -1610,7 +1610,7 @@ def set_minor_locator(self, locator): ACCEPTS: a :class:`~matplotlib.ticker.Locator` instance """ - if not hasattr(locator, 'tick_values'): + if not isinstance(locator, mticker.Locator): raise TypeError("formatter argument should be instance of " "matplotlib.ticker.Locator") self.isDefault_minloc = False