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

various issues with enum.{IntEnum,Flag,IntFlag} #66

Open
anntzer opened this issue Aug 9, 2019 · 1 comment · May be fixed by #68
Open

various issues with enum.{IntEnum,Flag,IntFlag} #66

anntzer opened this issue Aug 9, 2019 · 1 comment · May be fixed by #68

Comments

@anntzer
Copy link
Contributor

anntzer commented Aug 9, 2019

  • PrettyPrinter version: 0.18.0
  • Python version: 3.0
  • Operating System: linux

Description

The prettyrepr of {IntEnum,Flag,IntFlag} instances is less than optimal.

What I Did

from enum import Enum, IntEnum, Flag, IntFlag
from prettyprinter import cpprint

for base in [Enum, IntEnum, Flag, IntFlag]:
    class A(base):
        a = 1; b = 2
    print(base)
    cpprint(A.a)
    print(A.a)
    if issubclass(base, Flag):
        cpprint(A.a | A.b)
        print(A.a | A.b)
    print()

yields

<enum 'Enum'>
A.a  # ok
A.a  # (reference)

<enum 'IntEnum'>
A(<A.a: 1>)  # non eval'able; should either be "A.a" (better) or "1" (worse)
A.a  # (reference)

<enum 'Flag'>
A.a  # ok
A.a  # (reference)
A.None  # wrong
A.b|a  # (reference)

<enum 'IntFlag'>
A(<A.a: 1>)  # same issue as with IntEnum
A.a  # (reference)
A(<A.b|a: 3>)  # non eval'able, but I think the non-evalable form "A.b|a" is clearly best
A.b|a  # (reference)
@anntzer anntzer linked a pull request Aug 18, 2019 that will close this issue
@asford
Copy link

asford commented Jul 6, 2021

Also breaks common class StringEnum(str, Enum) style declarations... 😠

@register_pretty('enum.Enum')
@register_pretty('enum.IntEnum')
@register_pretty('enum.Flag')
@register_pretty('enum.IntFlag')
@register_pretty('enum.StrEnum')
def pretty_enum_custom(value, ctx):
    cls = type(value)
    if value.name is not None:
        return classattr(cls, value.name)
    else:  # Combined flags.
        s = str(value)
        prefix = cls.__name__ + "."
        assert s.startswith(prefix)
        return classattr(cls, s[len(prefix):])

@prettyprinter.register_pretty(str)
def pretty_str_custom(v, ctx, *args, **kwargs):
    if isinstance(v, enum.Enum):
        return prettyprinter.pretty_stdlib.pretty_enum(v, ctx)
    else:
        return prettyprinter.pretty_stdlib.pretty_str(v, ctx)

Much better! 🌴 😌

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants