Как я могу использовать mypy для проверки типа даты, которая не может быть датой и временем? - PullRequest
3 голосов
/ 20 февраля 2020

Допустим, у меня есть эта функция:

def subtract_dates(date1: datetime.date, date2: datetime.date):
    return date1 - date2

Если я попытаюсь вызвать subtract_dates(datetime.date.today(), datetime.datetime.now()), это вызовет ошибку TypeError, потому что я пытаюсь вычесть объект datetime из объекта date .

Однако, поскольку datetime наследуется от даты (см., Например, этот выпуск ), MyPy не вызывает ошибку при вышеуказанном вызове subtract_dates.

Is Есть ли способ добавить подсказку типа MyPy, которая позволяет объект даты, но не объект даты и времени?

1 Ответ

1 голос
/ 20 февраля 2020

Я бы решил это путем перегрузки функций . Пример:

import datetime
from typing import NoReturn, overload


@overload
def subtract_dates(date1: datetime.date, date2: datetime.datetime) -> NoReturn: ...

@overload
def subtract_dates(date1: datetime.datetime, date2: datetime.date) -> NoReturn: ...

@overload
def subtract_dates(date1: datetime.date, date2: datetime.date) -> datetime.timedelta: ...


# this is your original function implementation    
def subtract_dates(date1: datetime.date, date2: datetime.date):
    return date1 - date2

Теперь вычитание дат по-прежнему разрешено, при использовании datetime объекты будут перехвачены:

subtract_dates(datetime.date.today(), datetime.datetime.now()).days

выдаст вам ошибку

<string>:1: error: "NoReturn" has no attribute "days"
Found 1 error in 1 file (checked 1 source file)
...