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

Enum.__str__ change could be improved in What's New #98250

Closed
mdboom opened this issue Oct 13, 2022 · 2 comments · Fixed by #98295
Closed

Enum.__str__ change could be improved in What's New #98250

mdboom opened this issue Oct 13, 2022 · 2 comments · Fixed by #98295
Assignees
Labels
3.11 only security fixes docs Documentation in the Doc dir stdlib Python modules in the Lib dir

Comments

@mdboom
Copy link
Contributor

mdboom commented Oct 13, 2022

#30582 (in 3.11) introduced a change to Enum.__str__ so that it shows the enum name and the member name, whereas prior it only included the member name.

This could be a breaking change in some cases. As an example in real world code, the Azure CLI uses enums for the acceptable values of command-line flags, and then uses str on the enum to generate the string that is passed to the subprocess as arguments.

For example, this enum is used to define a "compute model":

class ComputeModelType(str, Enum):

    provisioned = "Provisioned"
    serverless = "Serverless"

And then it's used here to construct arguments for a subprocess:

self.cmd('sql db update -g {} --server {} --name {} --compute-model {}'
                 .format(resource_group, server, database_name, compute_model_serverless),

The changelog entry for this change just says:

IntEnum / IntFlag / StrEnum fixes: these now inherit from ReprEnum so the str() output now matches format() output, which is the data types’ (so both str(AnIntEnum.ONE) and format(AnIntEnum.ONE) is equal to '1').

This is unlikely to be easily findable for users running into this change, since StrEnum doesn't exist in Python 3.10, and it's a little obscure. I would suggest:

The default str() of an Enum has changed to include both Enum name and the member name (Enum.MEMBER), whereas before it was just the member name. To continue to use the old behavior, inherit from IntEnum or StrEnum.

Does this make sense? Are there other cases I'm missing? Happy to file a PR, but thought I would get some discussion first.

@mdboom mdboom added the docs Documentation in the Doc dir label Oct 13, 2022
@mdboom mdboom changed the title Enum.__str__ change should be more clear in What's New Enum.__str__ change could be improved in What's New Oct 13, 2022
@mdboom mdboom added stdlib Python modules in the Lib dir 3.11 only security fixes labels Oct 13, 2022
@ethanfurman
Copy link
Member

I'm more than happy to have help crafting a better What's New entry. Keep in mind that the change you are talking about is format, not str -- str() output hasn't changed, format() has changed to match str().

@CAM-Gerlach
Copy link
Member

Hey, I didn't see this before I first submitted #98295, but I'd noticed something similar, and I've revised that PR to further resolve this issue.

ezio-melotti pushed a commit that referenced this issue Oct 18, 2022
* Whatsnew: Convert literals in enum section to actual x-references

* Whatsnew: Rewrite enum section for clear and consistant phrasing

* Whatsnew: Combine directly related enum items instead of seperating them

* gh-98250: Describe __str__/__format__ changes more clearly/accurately

* Tweak enum section language per feedback from Ethan
miss-islington pushed a commit to miss-islington/cpython that referenced this issue Oct 18, 2022
)

* Whatsnew: Convert literals in enum section to actual x-references

* Whatsnew: Rewrite enum section for clear and consistant phrasing

* Whatsnew: Combine directly related enum items instead of seperating them

* pythongh-98250: Describe __str__/__format__ changes more clearly/accurately

* Tweak enum section language per feedback from Ethan
(cherry picked from commit 73e5180)

Co-authored-by: C.A.M. Gerlach <[email protected]>
miss-islington added a commit that referenced this issue Oct 18, 2022
* Whatsnew: Convert literals in enum section to actual x-references

* Whatsnew: Rewrite enum section for clear and consistant phrasing

* Whatsnew: Combine directly related enum items instead of seperating them

* gh-98250: Describe __str__/__format__ changes more clearly/accurately

* Tweak enum section language per feedback from Ethan
(cherry picked from commit 73e5180)

Co-authored-by: C.A.M. Gerlach <[email protected]>
@CAM-Gerlach CAM-Gerlach self-assigned this Oct 18, 2022
pablogsal pushed a commit that referenced this issue Oct 22, 2022
* Whatsnew: Convert literals in enum section to actual x-references

* Whatsnew: Rewrite enum section for clear and consistant phrasing

* Whatsnew: Combine directly related enum items instead of seperating them

* gh-98250: Describe __str__/__format__ changes more clearly/accurately

* Tweak enum section language per feedback from Ethan
(cherry picked from commit 73e5180)

Co-authored-by: C.A.M. Gerlach <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
3.11 only security fixes docs Documentation in the Doc dir stdlib Python modules in the Lib dir
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants