from typing import TypeVar, Type
from datetime import date, datetime
DateOutType = TypeVar('DateOutType', str, date)
def date2str(t: date, out_format: Type[DateOutType]=Type[str]) -> DateOutType:
''' Converts datetime.date to string (YYYY-MM-DD) or datetime.date output.
'''
if out_format is str:
return t.strftime('%Y-%m-%d')
elif isinstance(t, datetime):
return t.date()
else:
return t
# Usage example:
dt = datetime.now()
res = date2str(dt, out_format=date)
assert type(res) == date
res = date2str(dt.date(), out_format=str)
assert type(res) == str
mypy在return语句上给出了错误(TypeVar似乎不像我期望的那样工作:]
first return statement: error: Incompatible return value type (got "str", expected "date")
second return statement: error: Incompatible return value type (got "date", expected "str")
third return statement: error: Incompatible return value type (got "date", expected "str")
有什么想法吗?有没有更好的方法来编写带有适当类型注释的代码?
目的是使函数过载并允许多种类型的输入以及用户定义的相干输出。因此,我设置了一个类型为str或datetime.date的Type [TypeVar](第二个函数参数,带有...
out_format=date
或out_format=str
。这也减少了误导:您的原始函数实际上并不总是返回str,因此将其称为date2str
有点令人困惑。完全删除normalize_date
也可能是一个好主意:datetime是日期的子类,这意味着在任何只希望有日期的地方使用datetime是有效的。这意味着确实不需要显式地将日期时间转换为日期
例如,以下两幅照片将做完全相同的事情(根据mypy,将键入check:]
from datetime import datetime
dt = datetime.now()
print(date_to_str(dt))
print(date_to_str(normalize_date(dt)))