Python 3.8与3.12.4中IntFlag枚举iter遍历行为差异问题
问题原因
Python 3.10 对IntFlag的迭代行为做了变更:iter(IntFlag)不再包含值为0的枚举成员(比如你的Encoder.H1 = 0x00)。因为0作为标志位不会改变任何组合结果,新版本迭代时会自动过滤这类成员,这就导致3.12里signal in iter(Encoder)返回False,而3.8及更早版本会包含所有定义的成员。
兼容两个版本的解决办法
以下几种方式都能在Python 3.8和3.12中正常工作:
方法1:直接检查成员是否在枚举的成员集合中
用Encoder.__members__.values()获取所有定义的枚举成员,这个集合不受版本迭代行为变更的影响:
from enum import unique, IntFlag @unique class Encoder(IntFlag): H1 = 0x00 H2 = 0x01 H3 = 0x02 signal = Encoder.H1 assert signal in Encoder.__members__.values(), f"Valid Encoder line is integer 0 to 2 inclusive."
方法2:直接指定允许的成员
如果枚举成员数量不多,直接列举所有合法成员更直观:
assert signal in (Encoder.H1, Encoder.H2, Encoder.H3), f"Valid Encoder line is integer 0 to 2 inclusive."
方法3:检查实例类型(仅适用于signal是枚举实例的场景)
如果你的signal始终是Encoder的实例(不是直接传入整数),可以用类型检查:
assert isinstance(signal, Encoder), f"Valid Encoder line must be an Encoder enum member."
内容的提问来源于stack exchange,提问作者mhanuel
相关产品推荐
相关产品推荐

