New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
bpo-37376: pprint support for SimpleNamespace #14318
bpo-37376: pprint support for SimpleNamespace #14318
Conversation
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
8ee8ca1
to
68ff595
Compare
I have made the requested changes; please review again. |
Thanks for making the requested changes! @serhiy-storchaka: please review the changes made to this pull request. |
Misc/NEWS.d/next/Library/2019-06-24-11-26-34.bpo-37376.SwSUQ4.rst
Outdated
Show resolved
Hide resolved
68ff595
to
2bd11f2
Compare
I have made the requested changes; please review again. |
Thanks for making the requested changes! @serhiy-storchaka: please review the changes made to this pull request. |
Lib/test/test_pprint.py
Outdated
@@ -346,6 +346,36 @@ def test_mapping_proxy(self): | |||
('lazy', 7), | |||
('dog', 8)]))""") | |||
|
|||
def test_empty_simple_namespace(self): | |||
self.assertEqual(pprint.pformat(types.SimpleNamespace()), "namespace()") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
FWIW, code is almost always more readable when limited to one action per line. Among other things, it makes it much easier to understand what's happening (especially when parentheses are involved).
self.assertEqual(pprint.pformat(types.SimpleNamespace()), "namespace()") | |
formatted = pprint.pformat( | |
types.SimpleNamespace()) | |
self.assertEqual(formatted, "namespace()") |
Personally I like to separate the 3 parts (setup, actual-thing-to-test, assertions) with blank lines, for further readability, but that's more personal preference:
self.assertEqual(pprint.pformat(types.SimpleNamespace()), "namespace()") | |
ns = types.SimpleNamespace() | |
formatted = pprint.pformat(ns) | |
self.assertEqual(formatted, "namespace()") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I do not think that adding an empty line after every line of code will make the code more readable. Empty lines should be used for separating logical sections of the code.
This code is consistent with the code in this file and looks clear to me. I do not think that any changes are needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I followed most of @ericsnowcurrently's suggestions, but without the empty lines and without textwrap.dedent
to be consistent with the rest of the file and I think it has made the test more clear.
Lib/test/test_pprint.py
Outdated
lazy=7, | ||
dog=8, | ||
) | ||
self.assertEqual(pprint.pformat(n, width=60), """\ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
As before, I recommend one action per line.
self.assertEqual(pprint.pformat(n, width=60), """\ | |
formatted = pprint.pformat(ns, width=60) | |
self.assertEqual(formatted, """\ |
...and separating the key sections of the test.
self.assertEqual(pprint.pformat(n, width=60), """\ | |
formatted = pprint.pformat(ns, width=60) | |
self.assertEqual(formatted, """\ |
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
2bd11f2
to
7d3fbba
Compare
I have made the requested changes; please review again. @serhiy-storchaka I ended up removing the |
Thanks for making the requested changes! @ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request. |
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
7d3fbba
to
b701a7a
Compare
I have made the requested changes; please review again. @serhiy-storchaka ofc it was because of subclassing. Glad you're here to review! :D |
Thanks for making the requested changes! @ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request. |
Doc/library/pprint.rst
Outdated
@@ -25,6 +25,9 @@ width constraint. | |||
|
|||
Dictionaries are sorted by key before the display is computed. | |||
|
|||
.. versionchanged:: 3.9 | |||
Added support for pretty-printing :class:`types.SimpleNamespace`. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added support for pretty-printing :class:`types.SimpleNamespace`. | |
Added support for pretty-printing :class:`types.SimpleNamespace`. |
Lib/pprint.py
Outdated
@@ -342,6 +342,31 @@ def _pprint_mappingproxy(self, object, stream, indent, allowance, context, level | |||
|
|||
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy | |||
|
|||
def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): | |||
cls_name = object.__class__.__name__ | |||
if cls_name == "SimpleNamespace": |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If this check is for the sake of subclasses then I'd recommend being explicit about it:
if cls_name == "SimpleNamespace": | |
if type(object) is _types.SimpleNamespace: |
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
a584309
to
49fa618
Compare
I have made the requested changes; please review again. @ericsnowcurrently I attempted to make it more clear what the class-name-if-statement is about. Thank you very much to the both of you for the fast, high quality responses. It was a good experience :-) |
Thanks for making the requested changes! @ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request. |
@@ -342,6 +342,33 @@ def _pprint_mappingproxy(self, object, stream, indent, allowance, context, level | |||
|
|||
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy | |||
|
|||
def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): | |||
if type(object) is _types.SimpleNamespace: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for updating this. It's more clear now (as a reader).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And better. Checking the class by comparing the class name to a string is a bit wonky :D Thanks for pointing out, what I was actually doing.
Lib/pprint.py
Outdated
@@ -342,6 +342,33 @@ def _pprint_mappingproxy(self, object, stream, indent, allowance, context, level | |||
|
|||
_dispatch[_types.MappingProxyType.__repr__] = _pprint_mappingproxy | |||
|
|||
def _pprint_simplenamespace(self, object, stream, indent, allowance, context, level): | |||
if type(object) is _types.SimpleNamespace: | |||
# the SimpleNamespace repr is "namespace", while the class name is |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for adding a comment here. That helps. :) FWIW, the following might be more clear:
# The SimpleNamespace repr has "namespace" instead of the class name, so
# we do the same here. For subclasses we just use the class name.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Tried improving it, should be clear now
49fa618
to
8867ef7
Compare
https://bugs.python.org/issue37376