docs: def range(cls, start=None, stop=None, step=None, inclusive=False):
          """Generator of a date range
  
          Args:
              start (Date):
              stop (Date or datetime.timedelta)!
              step (timedelta):
          Keyword Args:
              inclusive (bool): If ``False``, the stopping date is not included.
                  This is the same behavior as the built-in :py:func:`range`.
          Yield:
              Date:
          """
  
          def sign(x):
              """Inner function for determining the sign of a float
              """
              return (-1, 1)[x >= 0]
  
          if not step:
              raise ValueError("Null step")
  
          # Convert stop from timedelta to Date object
          if isinstance(stop, timedelta):
              stop = start + stop
  
          if sign((stop - start).total_seconds()) != sign(step.total_seconds()):
              raise ValueError("start/stop order not coherent with step")
  
          date = start
  
          if step.total_seconds() > 0:
              oper = "__le__" if inclusive else "__lt__"
          else:
              oper = "__ge__" if inclusive else "__gt__"
  
          while getattr(date, oper)(stop):
              yield date
              date += step