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

2024-05-17 11:34:34 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这个函数:

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

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

但是,由于datetime继承自date(例如,请参见this issue),MyPy不会在上述对subtract_dates的调用中引发错误

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


Tags: 对象函数类型todaydatetimedatereturndef
1条回答
网友
1楼 · 发布于 2024-05-17 11:34:34

我会用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)

相关问题 更多 >