Skip to content

bpo-37376: pprint support for SimpleNamespace #14318

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

Merged
merged 1 commit into from
Jun 26, 2019

Conversation

carlbordum
Copy link
Contributor

@carlbordum carlbordum commented Jun 23, 2019

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM in general.

Only needed to document this change:

  • Add the versionchanged directive in the pprint module documentation.
  • Add a news entry in Misc/NEWS.d (use blurb).
  • Add an entry in the What's New document.
  • Add your name in Misc/ACKS if it is not there yet.

@bedevere-bot
Copy link

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 I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@serhiy-storchaka serhiy-storchaka added the type-feature A feature request or enhancement label Jun 23, 2019
@carlbordum carlbordum force-pushed the pprint-simplenamespace branch 2 times, most recently from 8ee8ca1 to 68ff595 Compare June 24, 2019 09:53
@carlbordum
Copy link
Contributor Author

I have made the requested changes; please review again.

@bedevere-bot
Copy link

Thanks for making the requested changes!

@serhiy-storchaka: please review the changes made to this pull request.

@carlbordum carlbordum force-pushed the pprint-simplenamespace branch from 68ff595 to 2bd11f2 Compare June 24, 2019 14:56
@carlbordum
Copy link
Contributor Author

I have made the requested changes; please review again.

@bedevere-bot
Copy link

Thanks for making the requested changes!

@serhiy-storchaka: please review the changes made to this pull request.

Copy link
Member

@ericsnowcurrently ericsnowcurrently left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working on this! Mostly LGTM. I've left a few comments.

@@ -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()")
Copy link
Member

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).

Suggested change
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:

Suggested change
self.assertEqual(pprint.pformat(types.SimpleNamespace()), "namespace()")
ns = types.SimpleNamespace()
formatted = pprint.pformat(ns)
self.assertEqual(formatted, "namespace()")

Copy link
Member

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.

Copy link
Contributor Author

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.

lazy=7,
dog=8,
)
self.assertEqual(pprint.pformat(n, width=60), """\
Copy link
Member

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.

Suggested change
self.assertEqual(pprint.pformat(n, width=60), """\
formatted = pprint.pformat(ns, width=60)
self.assertEqual(formatted, """\

...and separating the key sections of the test.

Suggested change
self.assertEqual(pprint.pformat(n, width=60), """\
formatted = pprint.pformat(ns, width=60)
self.assertEqual(formatted, """\

@bedevere-bot
Copy link

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 I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@carlbordum
Copy link
Contributor Author

I have made the requested changes; please review again.

@serhiy-storchaka I ended up removing the write = stream.write optimization. If you do think it is worth it in this case, please let me know and I'll bring it back (properly this time, as pointed out by @ericsnowcurrently).

@bedevere-bot
Copy link

Thanks for making the requested changes!

@ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a test for a SimpleNamespace subclass.

@bedevere-bot
Copy link

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 I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@carlbordum carlbordum force-pushed the pprint-simplenamespace branch from 7d3fbba to b701a7a Compare June 25, 2019 18:42
@carlbordum
Copy link
Contributor Author

I have made the requested changes; please review again.

@serhiy-storchaka ofc it was because of subclassing. Glad you're here to review! :D

@bedevere-bot
Copy link

Thanks for making the requested changes!

@ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request.

Copy link
Member

@serhiy-storchaka serhiy-storchaka left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you Carl. LGTM, just fix an indentation in docs.

@@ -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`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Added support for pretty-printing :class:`types.SimpleNamespace`.
Added support for pretty-printing :class:`types.SimpleNamespace`.

Copy link
Member

@ericsnowcurrently ericsnowcurrently left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for working to resolve our various comments!

Other than one small thing, LGTM.

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":
Copy link
Member

@ericsnowcurrently ericsnowcurrently Jun 25, 2019

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:

Suggested change
if cls_name == "SimpleNamespace":
if type(object) is _types.SimpleNamespace:

@bedevere-bot
Copy link

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 I have made the requested changes; please review again. I will then notify any core developers who have left a review that you're ready for them to take another look at this pull request.

@carlbordum carlbordum force-pushed the pprint-simplenamespace branch 2 times, most recently from a584309 to 49fa618 Compare June 26, 2019 16:40
@carlbordum
Copy link
Contributor Author

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 :-)

@bedevere-bot
Copy link

Thanks for making the requested changes!

@ericsnowcurrently, @serhiy-storchaka: please review the changes made to this pull request.

Copy link
Member

@ericsnowcurrently ericsnowcurrently left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. I'm approving this, but also leaving one last comment. :) (feel free to ignore)

Thanks again for doing this.

@@ -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:
Copy link
Member

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).

Copy link
Contributor Author

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
Copy link
Member

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.

Copy link
Contributor Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
type-feature A feature request or enhancement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants