前阵项目有个范围需求,最开始用的range,但是没法处理连续的。然后搜了一下果然有轮子,不过最开始搜中文搜到的大多是interval这个库,
pypi地址:https://pypi.org/project/interval/#description。
链接的官网都打不开了,文档啥的也没了,而且实测再Python3下无限区间有点问题。
接着又搜到python-intervals这个库,这个基本没啥问题了,Python支持的挺好,文档也齐全。
安装和基本用法文档里写了:
https://github.com/AlexandreDecan/python-intervals
简单记录个别的用法,就是开闭区间作为参数传递,不直接用封装好的接口。而封装好的接口实际上也是调用的底层的AtomicInterval.
AtomicInterval类实例化时接收四个参数:
left:左侧开闭(布尔型)
lower:下限
upper:上限
right:右侧开闭(布尔型)
#section = Interval(AtomicInterval(left, lower, upper, right))
#实例:
from intervals import Interval,AtomicInterval
#生成一个左闭右开的2-4的区间
section = Interval(AtomicInterval(True, 1, 2, False))
section
Out[4]: [1,2)
AtomicInterval源码:
class AtomicInterval:
"""
This class represents an atomic interval.
An atomic interval is a single interval, with a lower and upper bounds,
and two (closed or open) boundaries.
"""
__slots__ = ('_left', '_lower', '_upper', '_right')
def __init__(self, left, lower, upper, right):
"""
Create an atomic interval.
If a bound is set to infinity (regardless of its sign), the corresponding boundary will
be exclusive.
:param left: Boolean indicating if left boundary is inclusive (True) or exclusive (False).
:param lower: value of the lower bound.
:param upper: value of the upper bound.
:param right: Boolean indicating if right boundary is inclusive (True) or exclusive (False).
"""
self._left = left if lower not in [inf, -inf] else OPEN
self._lower = lower
self._upper = upper
self._right = right if upper not in [inf, -inf] else OPEN
if self.is_empty():
self._left = OPEN
self._lower = inf
self._upper = -inf
self._right = OPEN