Ethan Furman <et...@stoneleaf.us> added the comment:

The code sample:

    class Color(IntFlag):
        BLACK = 0
        RED = 1
        GREEN = 2
        BLUE = 4
        PURPLE = RED | BLUE
        WHITE = RED | GREEN | BLUE

Here's the summary of the changes:

- single-bit flags are canonical
- multi-bit and zero-bit flags are aliases
+ only canonical flags are returned during iteration

    >>> list(Color.WHITE)
    [<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 4>]

- negating a flag or flag set returns a new flag/flag set with the
  corresponding positive integer value

    >> Color.GREEN
    <Color.GREEN: 2>

    >> ~Color.GREEN
    <Color.PURPLE: 5>

- `name`s of pseudo-flags are constructed from their members' names

    >>> (Color.RED | Color.GREEN).name
    'RED|GREEN'

- multi-bit flags, aka aliases, can be returned from operations

    >>> Color.RED | Color.BLUE
    <Color.PURPLE: 5>

    >>> Color(7)  # or Color(-1)
    <Color.WHITE: 7>

- membership / containment checking has changed slightly -- zero valued flags
  are never considered to be contained:

    >>> Color.BLACK in Color.WHITE
    False

  otherwise, if all bits of one flag are in the other flag, True is returned:

    >>> Color.PURPLE in Color.WHITE
    True

There is a new boundary mechanism that controls how out-of-range / invalid bits 
are handled: `STRICT`, `CONFORM`, `EJECT', and `KEEP':

  STRICT --> raises an exception when presented with invalid values
  CONFORM --> discards any invalid bits
  EJECT --> lose Flag status and become a normal int with the given value
  KEEP --> keep the extra bits
           - keeps Flag status and extra bits
           - they don't show up in iteration
           - they do show up in repr() and str()

The default for Flag is STRICT, the default for IntFlag is DISCARD, and the 
default for _convert_ is KEEP (see ssl.Options for an example of when KEEP is 
needed).

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue38250>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to