Python中如何判断数值是否属于枚举定义的slice对象对应区间?
解决方案
Python 原生的slice对象仅作为切片参数的存储结构体,没有实现__contains__逻辑,因此直接用age in slice(...)无法得到预期结果。
最符合Python风格的实现是借助内置range类型完成判断:range与slice的参数规则完全兼容,且自带O(1)复杂度的成员判断实现,不需要自己手写边界校验逻辑,同时天然支持step参数。
代码实现
首先写一个通用的in_slice判断工具:
def in_slice(num: int, s: slice) -> bool: start = s.start or 0 stop = s.stop step = s.step or 1 # 处理无上限的区间场景 if stop is None: return num >= start and (num - start) % step == 0 return num in range(start, stop, step)
之后改造匹配函数即可:
def get_category(age: int) -> AgeCategory: for age_range in AgeCategory: if in_slice(age, age_range.value): return age_range assert False, "unreachable"
额外优化提示
如果你的AgeCategory枚举项是按年龄从小到大有序定义的,也可以用bisect模块预存所有区间边界,将查找复杂度从O(n)降到O(logn),枚举项不多的场景下遍历的性能已经完全够用。
内容的提问来源于stack exchange,提问作者Greedo
相关产品推荐
相关产品推荐

