假设我具有此功能:
def subtract_dates(date1: datetime.date, date2: datetime.date):
return date1 - date2
[如果我尝试调用subtract_dates(datetime.date.today(), datetime.datetime.now())
,这将引发TypeError,因为我正在尝试从datetime
对象中减去date
对象。
但是,由于datetime从日期继承(例如参见this issue,因此MyPy不会在上述对subtract_dates
的调用中引发错误。
是否可以添加允许日期对象但不允许日期时间对象的MyPy类型提示?
我会用function overloading解决。示例:
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)