Regarding irregular flag enumerations, aliases and canonical members
@ethanfurman 已經在處理了。
開始於 2026年7月16日。
- 主要語言
- Python
- 星號
- 77.2k
- 分支
- 35.9k
- PR 合併指標
- PR 指標待擷取
描述
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>
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
評估
這個 Issue 還沒有評估資料。