Currently, the overload order is:
|
if sys.version_info >= (3, 8): |
|
@overload # type: ignore[override] |
|
def __sub__(self, __value: timedelta) -> Self: ... |
|
@overload |
|
def __sub__(self: _D, __value: _D) -> timedelta: ... |
However, both the c-module and the fallback pydatetime first check if other is a datetime:
def __sub__(self, other):
"Subtract two datetimes, or a datetime and a timedelta."
if not isinstance(other, datetime):
if isinstance(other, timedelta):
return self + -other
return NotImplemented
https://github.com/python/cpython/blob/c7d68f907ad3e3aa17546df92a32bddb145a69bf/Lib/_pydatetime.py#L2235-L2257
https://github.com/python/cpython/blob/1198076447f35b19a9173866ccb9839f3bcf3f17/Modules/_datetimemodule.c#L5608
So shouldn't the overload order be vice versa?
Also, I noticed that at runtime, timedelta has __rdivmod__, __rmod__ and datetime has __rsub__, which are missing in the stub. But I guess this is because the pure python fallback doesn't have them.
Currently, the overload order is:
typeshed/stdlib/datetime.pyi
Lines 319 to 323 in 40caa05
However, both the c-module and the fallback
pydatetimefirst check if other is adatetime:https://github.com/python/cpython/blob/c7d68f907ad3e3aa17546df92a32bddb145a69bf/Lib/_pydatetime.py#L2235-L2257
https://github.com/python/cpython/blob/1198076447f35b19a9173866ccb9839f3bcf3f17/Modules/_datetimemodule.c#L5608
So shouldn't the overload order be vice versa?
Also, I noticed that at runtime,
timedeltahas__rdivmod__,__rmod__anddatetimehas__rsub__, which are missing in the stub. But I guess this is because the pure python fallback doesn't have them.