以下是基本功能(一旦确定此版本,我将对其进行进一步扩展:]

问题描述 投票:0回答:1
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](第二个函数参数,带有...
python generics typing mypy
1个回答
1
投票
最终,您的用户无需输入任何字符,因为他们不需要在所有位置都包含out_format=dateout_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)))
© www.soinside.com 2019 - 2024. All rights reserved.