我如何使用mypy输入不能为日期时间的日期?

问题描述 投票:2回答:1

假设我具有此功能:

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类型提示?

python mypy
1个回答
0
投票

我会用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)
© www.soinside.com 2019 - 2024. All rights reserved.