[Python-ideas] IntFlags

Chris Angelico rosuav at gmail.com
Wed Mar 4 16:31:25 CET 2015


On Thu, Mar 5, 2015 at 2:17 AM, Andrew Barnert
<abarnert at yahoo.com.dmarc.invalid> wrote:
> Another issue that came up was that C flags often have "combined" names that are ambiguous: RDWR = RDONLY | WRONLY), which is fine until you want a repr (in C, it's just going to print 3); does it have to be smart enough to show RDWR? (Or, worse, RDWR | CLOEXEC.)
>

That could probably be handled by going through the flags in iteration
order. If the flag is present, emit it and move on. Something like
this:

from enum import IntEnum

class Flags(IntEnum):
    RDWR = 3
    RDONLY = 1
    WRONLY = 2
    CLOEXEC = 4

def flag_str(flg):
    names = []
    for flag in Flags:
        if (flg&flag) == flag:
            flg -= flag
            names.append(str(flag))
    return "|".join(names)

print(flag_str(Flags.RDWR|Flags.CLOEXEC))
print(flag_str(Flags.RDONLY|Flags.CLOEXEC))


As long as the combined versions come up ahead of the others, they'll
be used. Alternatively, if you prefer them _not_ to be used, just put
them after the individual forms, and then the str() will expand them
out.

ChrisA


More information about the Python-ideas mailing list