Python Enum问题:如何让枚举成员表现得像0?(Python 2.7)
Python 2.7 Enum:让特定成员在布尔判断中表现得像0的解决方法
嘿,我之前也踩过这个坑!你直接给枚举成员绑定__nonzero__方法没用的原因是:在Python 2.7里我们用的Enum(一般是enum34库提供的,毕竟原生2.7没自带枚举),它的成员是由元类生成的实例,Python的布尔判断逻辑只会去调用类级别定义的特殊方法,单个成员绑定的方法根本不会被触发。
要实现让FOO这类特定成员在if语句里表现得像0(也就是被判定为False),zvone的这个方案亲测有效,分享给你:
from enum import Enum class CustomEnum(Enum): FOO = 1 BAR = 2 BAZ = 3 def __nonzero__(self): # 只让FOO返回False,其他成员都返回True return self is not CustomEnum.FOO # 测试验证 if CustomEnum.FOO: print("FOO被当成True") else: print("FOO被当成False") # 这行将会输出 if CustomEnum.BAR: print("BAR被当成True") # 这行将会输出
如果你的需求是“值为某个特定数的成员表现得像0”,也可以把判断逻辑改成基于成员的值,比如return self.value != 0,但如果是像你说的“部分常量表现得像0但默认值不是”,上面这种直接指定成员的方式更灵活。
另外提一句:Python 2.7里控制布尔判断的是__nonzero__方法,返回False就会被视为“像0”;要是换成Python3的话就得用__bool__方法,但你明确是针对2.7,所以用__nonzero__就刚好适配。
内容的提问来源于stack exchange,提问作者Anton Ovsyannikov
相关产品推荐
相关产品推荐

