{"id":21830,"library":"python-ranges","title":"python-ranges","description":"Continuous Range, RangeSet, and RangeDict data structures for Python >=3.9. v1.2.2 provides immutable and hashable interval/multi-interval containers with O(log n) operations. Moderate release cadence.","status":"active","version":"1.2.2","language":"python","source_language":"en","source_url":"https://github.com/superbird11/ranges","tags":["range","interval","set","dict","overlap","continuous"],"install":[{"cmd":"pip install python-ranges","lang":"bash","label":"Default Install"}],"dependencies":[],"imports":[{"note":"Directly from ranges package.","symbol":"Range","correct":"from ranges import Range"},{"note":"Collection of non-overlapping ranges.","symbol":"RangeSet","correct":"from ranges import RangeSet"},{"note":"Mapping from ranges to values.","symbol":"RangeDict","correct":"from ranges import RangeDict"}],"quickstart":{"code":"from ranges import Range, RangeSet, RangeDict\n\n# Create a Range\nr = Range(1, 5)  # [1, 5)\nprint(r)  # Range(1, 5)\n\n# Check membership\nprint(3 in r)  # True\nprint(5 in r)  # False\n\n# Intersection, union\nr2 = Range(3, 7)  # [3, 7)\nprint(r & r2)  # Range(3, 5)\nprint(r | r2)  # RangeSet(Range(1, 7))\n\n# RangeSet\nrs = RangeSet(r, Range(10, 15))\nprint(rs)  # RangeSet(Range(1, 5), Range(10, 15))\n\n# RangeDict\nrd = RangeDict({Range(0, 10): 'low', Range(10, 20): 'high'})\nprint(rd[5])  # 'low'","lang":"python","description":"Basic usage of Range, RangeSet, and RangeDict."},"warnings":[{"fix":"Remember that Range(a, b) includes a but excludes b. Use Range.closed(a, b) for inclusive endpoints if needed.","message":"Ranges are half-open [start, end) by default. Mistaking inclusive/exclusive leads to off-by-one errors.","severity":"breaking","affected_versions":"all"},{"fix":"Always validate that start <= end before constructing a Range.","message":"Range objects are immutable and hashable, but creation with invalid bounds (start > end) raises ValueError.","severity":"gotcha","affected_versions":"all"},{"fix":"Always use Range objects as keys in RangeDict.","message":"When using RangeDict, keys must be Range objects; plain tuples or integers will not work and may raise TypeError or silently misbehave.","severity":"gotcha","affected_versions":"all"}],"env_vars":null,"last_verified":"2026-04-27T00:00:00.000Z","next_check":"2026-07-26T00:00:00.000Z","problems":[{"fix":"Ensure start <= end, e.g., Range(1, 5).","cause":"Attempting to create Range(5, 1) where start > end.","error":"ValueError: Cannot create Range with start > end"},{"fix":"Replace slice with Range: my_dict[Range(1, 5)].","cause":"Using slice objects (e.g., my_dict[1:5]) when Range objects are expected.","error":"TypeError: unhashable type: 'slice'"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}