Skip to content
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

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

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.

Lib/pprint.py Outdated Show resolved Hide resolved
@bedevere-bot
Copy link

bedevere-bot commented Jun 23, 2019

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 Jun 24, 2019
@carlbordum
Copy link
Contributor Author

carlbordum commented Jun 24, 2019

I have made the requested changes; please review again.

@bedevere-bot
Copy link

bedevere-bot commented Jun 24, 2019

Thanks for making the requested changes!

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

Doc/library/pprint.rst Outdated Show resolved Hide resolved
Misc/ACKS Show resolved Hide resolved
@carlbordum
Copy link
Contributor Author

carlbordum commented Jun 24, 2019

I have made the requested changes; please review again.

@bedevere-bot
Copy link

bedevere-bot commented Jun 24, 2019

Thanks for making the requested changes!

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

Doc/library/pprint.rst Outdated Show resolved Hide resolved
Doc/library/pprint.rst Outdated Show resolved Hide resolved
Copy link
Member

@ericsnowcurrently ericsnowcurrently left a comment

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

@ericsnowcurrently ericsnowcurrently Jun 24, 2019

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

@serhiy-storchaka serhiy-storchaka Jun 25, 2019

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

@carlbordum carlbordum Jun 25, 2019

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 Show resolved Hide resolved
Lib/test/test_pprint.py Outdated Show resolved Hide resolved
Lib/test/test_pprint.py Outdated Show resolved Hide resolved
lazy=7,
dog=8,
)
self.assertEqual(pprint.pformat(n, width=60), """\
Copy link
Member

@ericsnowcurrently ericsnowcurrently Jun 24, 2019

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, """\

Lib/pprint.py Outdated Show resolved Hide resolved
Lib/pprint.py Outdated Show resolved Hide resolved
Lib/pprint.py Outdated Show resolved Hide resolved
Lib/pprint.py Show resolved Hide resolved
Lib/pprint.py Show resolved Hide resolved
@bedevere-bot
Copy link

bedevere-bot commented Jun 24, 2019

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

carlbordum commented Jun 25, 2019

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

bedevere-bot commented Jun 25, 2019

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

Add a test for a SimpleNamespace subclass.

@bedevere-bot
Copy link

bedevere-bot commented Jun 25, 2019

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

carlbordum commented Jun 25, 2019

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

bedevere-bot commented Jun 25, 2019

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

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

@serhiy-storchaka serhiy-storchaka Jun 25, 2019

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

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

bedevere-bot commented Jun 25, 2019

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 Jun 26, 2019
@carlbordum
Copy link
Contributor Author

carlbordum commented Jun 26, 2019

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

bedevere-bot commented Jun 26, 2019

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

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

@ericsnowcurrently ericsnowcurrently Jun 26, 2019

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

@carlbordum carlbordum Jun 26, 2019

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

@ericsnowcurrently ericsnowcurrently Jun 26, 2019

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

@carlbordum carlbordum Jun 26, 2019

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

@ericsnowcurrently ericsnowcurrently added the 🤖 automerge PR will be merged once it's been approved and all CI passed label Jun 26, 2019
@miss-islington miss-islington merged commit 06a8916 into python:master Jun 26, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🤖 automerge PR will be merged once it's been approved and all CI passed type-feature A feature request or enhancement
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants