Python 如何使用mypy来检查不能是datetime的日期?

Python 如何使用mypy来检查不能是datetime的日期?,python,mypy,Python,Mypy,假设我有这个函数: def subtract_dates(date1: datetime.date, date2: datetime.date): return date1 - date2 如果我试图调用subtract_dates(datetime.date.today(),datetime.datetime.now())这将引发一个类型错误,因为我试图从date对象中减去datetime对象 但是,由于datetime继承自date(例如,请参见),MyPy不会在上述调用减去日期时

假设我有这个函数:

def subtract_dates(date1: datetime.date, date2: datetime.date):
    return date1 - date2
如果我试图调用
subtract_dates(datetime.date.today(),datetime.datetime.now())
这将引发一个类型错误,因为我试图从
date
对象中减去
datetime
对象

但是,由于datetime继承自date(例如,请参见),MyPy不会在上述调用
减去日期时引发错误

有没有一种方法可以添加一个MyPy类型的提示,它允许一个日期对象,但不允许一个日期时间对象?

我可以通过以下方法来解决它。例如:

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)
:1:错误:“NoReturn”没有属性“days”
在1个文件中发现1个错误(选中1个源文件)

删除了
Python
标记,因为这是
MyPy
独有的问题@Felipe请参见。Python是一个宽泛的标记,MyPy当然属于Python的宽泛标记。这个解决方案实际上不起作用,因为MyPy很乐意在许多中间点剥离类型专用性。如果你有这样的函数,请考虑:<代码> DEF LaundRead(x:DATETIME.DATE)-> DATEMEM.DATE:返回x< /代码>,然后你可以做<代码>减法符日期(LaundLeDead(DATEST.DATEST.No)(日期)),DATE时间。日期(天)()。这确实是一个需要在
mypy
本身中修复的bug:@Glyph通过松散键入
launder\u date()
来去除类型特异性,但可以通过使用泛型来修复:
def launder\u date(x:T)->T:…
T=TypeVar('T',bound datetime.date)
。我知道发生了什么:)。如果您知道
launder\u date
做了错误的事情,您可以修复它并让它做正确的事情;但是,这种特殊性剥离到处都有,包括在标准库中,所以你必须小心,永远不要绊倒它。有mypy的第一个目的是什么@Glyph啊,我明白了——事实上,如果不先更改stdlib的
datetime
,就无法绕过这个问题。