python / python/cpython

Regarding irregular flag enumerations, aliases and canonical members

Aperta
#153,802 1 commento 0 reazioni 1 assegnatario Vedi su GitHub

@ethanfurman ci sta già lavorando.

Dal 16/7/2026.

stdlib type-feature
Lingua principale
Python
Stelle
77.2k
Fork
35.9k
Metriche di merge delle PR
Metriche PR in attesa

Descrizione

This is a follow-up to #150577.

I did not find any other issues about my findings.

Flag enumeration members feature iteration, which yields only canonical members and not aliases, i.e. members being composed of canonical members.

However, there can be alias members being composed of absent canonical members:

from enum import Flag

class Missing(Flag):
    A = 7

assert list(Missing) == []
assert list(Missing.A) == [None, None, None]
assert ~Missing(0) == Missing(0)

Another real example are the flag enums in the ssl module, where canonical members are partially absent, analogous to:

from enum import Flag

class Partial(Flag):
    A = 1
    # Maybe there once was a `B` here?
    C = 3  # Is `C` now meant to be canonical?

assert list(Partial) == [Partial.A]
assert list(Partial.C) == [Partial.A, None]
assert ~Partial(0) == Partial.A

For completeness: Named zero-valued flags are also ignored, although being canonical:

from enum import Flag

class Named(Flag):
    ZERO = 0
    ONE = 1

assert list(Named) == [Named.ONE]
assert list(Named.ONE) == [Named.ONE]
assert ~Named.ONE == Named.ZERO

A remapping of values is the obvious approach, but not always feasible. For the ssl module, the flag values are dictated by the external OpenSSL library.

My expectation is that aliases composed of absent canonical members are also considered canonical and thereby yielded by iteration.


As a side note: Interestingly, for an IntFlag, missing values are added:

from enum import IntFlag

class Added(IntFlag):
    A = 2

print(~Added(0))
# <Added.A|1: 3>

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.