<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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