繁体   English   中英

mypy 抱怨:带有 Type[TypeVar['T', str, date]] 和 T 输出的函数类型注释:不兼容的返回值类型(得到“str”,预期为“date”)

[英]mypy complains: function type annotation with Type[TypeVar['T', str, date]] and T output: Incompatible return value type (got "str", expected "date")

目的是重载函数并允许多种类型的输入,以及用户定义的连贯输出。

因此,我设置了一个Type[TypeVar]strdatetime.date (第二个函数参数,默认值=str ),该函数将输出相关的TypeVar

以下是基本功能(一旦此版本修复,我将进一步扩展):

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")

有任何想法吗? 有没有更好的方法来编写带有正确类型注释的代码?

这里的问题是 mypy 不理解some_type is strtype(some_value) is str形式的表达式。 您需要改为执行issubclass(some_type, str)isinstance(some_value, str)

也就是说,在这种情况下,只创建两个不同的函数会更清晰:

def date_to_str(t: date) -> str:
    return t.strftime('%Y-%m-%d')

def normalize_date(t: date) -> date:
    if isinstance(t, datetime):
        return t.date()
    return t

这最终会减少用户输入的字符,因为他们不需要在任何地方都包含out_format=dateout_format=str 它的误导性也较小:您的原始函数实际上并不总是返回 str,因此将其date2str有点令人困惑。

完全删除normalize_date也可能是一个好主意:datetime 是 date 的子类,这意味着在任何只需要日期的地方使用 datetime 都是有效的。 这意味着确实不需要将日期时间显式转换为日期

例如,以下两个打印将执行完全相同的操作(并且会根据 mypy 进行类型检查):

from datetime import datetime

dt = datetime.now()
print(date_to_str(dt))
print(date_to_str(normalize_date(dt)))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM