下面的程序可以工作,但给出了一个MyPy错误。
from typing import Type, TypeVar, Any, Optional
T = TypeVar('T')
def check(element: Any, types: Type[T] = object) -> Optional[T]:
if not isinstance(element, types):
return None
return element
print(check(123, int))
print(check(123, object))
MyPy 抱怨。
main.py:7: error: Incompatible default for argument "types" (default has type "Type[object]", argument has type "Type[T]")
Found 1 error in 1 file (checked 1 source file)
我做错了什么?
替换 object
与 Type[object]
神秘的工作。
你使用的是 变量型 错位,应与 element
不 types
.
from typing import Optional, Type, TypeVar
T = TypeVar('T')
def check(element: T, types: Type = object) -> Optional[T]:
if not isinstance(element, types):
return None
return element
问题是,默认值必须适合所有可能的替换。T
. 由于它不正确的解决方法是定义重载,一个用 Type[T]
生产 Optional[T]
和一个有 Literal[object]
和生产 Any
. 然后在组合声明中,可以提供默认值。
Guido解决了这个问题 此处.