因此函数gendata
接受两个可选参数(name
和source
),然后根据source
的值调用parser
,调用的参数与该函数所需的参数相同
Type[SuperClass]
应该接受从它继承的所有子类。为什么mypy
在这种情况下投诉,为什么只针对arg 1和arg 2而不是arg 3(source
)李>exmaple.py:
from dataclasses import dataclass
from typing import List, Optional, Type
@dataclass
class BaseItem:
name: str
value: int
@dataclass
class Item(BaseItem):
pass
@dataclass
class AnotherItem(BaseItem):
pass
def parser(item: Type[BaseItem], name: str, source: int) -> Type[BaseItem]:
item.value = source
return item
def gendata(
items: List[Item], name: Optional[str] = None, source: Optional[int] = None
) -> None:
for item in items:
if source:
item = parser(item, name, source)
测试:
$ mypy example.py
e.py:31: error: Incompatible types in assignment (expression has type "Type[BaseItem]", variable has type "Item")
e.py:31: error: Argument 1 to "parser" has incompatible type "Item"; expected "Type[BaseItem]"
e.py:31: error: Argument 2 to "parser" has incompatible type "Optional[str]"; expected "str"
Found 3 errors in 1 file (checked 1 source file)
首先,关于
Type[Something]
错误,根据文档,当您接收类型作为参数时,应该使用Type[Something]
,如果您接收的是BaseItem
的实例,则应该使用BaseItem
例如:
参考:https://docs.python.org/3/library/typing.html#typing.Type
关于
Optional
错误,我通常将optional读作nullable(在文档中,他们甚至说Optional[X]
等同于Union[X, None]
)参考:https://docs.python.org/3/library/typing.html#typing.Optional
因此,如果您正在接收类型为
Optional[str]
的参数,并尝试传递给接收str
的函数,这将引发错误,一种解决方案是检查值是否为None
,并放置一个默认字符串,如:相关问题 更多 >
编程相关推荐