HTF*_*HTF 5 python type-hinting type-annotation
因此,该函数gendata接受两个可选参数(name和source),然后基于具有该函数所需的相同参数的source调用值。parser
Type[SuperClass]应该接受从它继承的所有子类。为什么mypy在这种情况下会抱怨,为什么只针对 arg 1 和 2 而不是 3 ( source)?例如:
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)
Run Code Online (Sandbox Code Playgroud)
测试:
$ 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)
Run Code Online (Sandbox Code Playgroud)
首先,关于Type[Something]错误,根据文档,您应该Type[Something]在接收类型作为参数时使用,如果您接收的是 的实例BaseItem,则应该使用BaseItem.
例子:
a = 3 # Has type 'int'
b = int # Has type 'Type[int]'
c = type(a) # Also has type 'Type[int]'
Run Code Online (Sandbox Code Playgroud)
参考: https: //docs.python.org/3/library/typing.html#typing.Type
关于Optional错误,我通常将可选读为可为空(在文档中他们甚至说Optional[X]相当于Union[X, None].
参考: https: //docs.python.org/3/library/typing.html#typing.Optional
因此,如果您接收一个类型的参数Optional[str]并尝试传递给接收 a 的函数str,这将引发错误,一种解决方案是检查该值是否为None,然后放置一个默认字符串,例如:
def gendata(
items: List[Item], name: Optional[str] = None, source: Optional[int] = None
) -> None:
if name is None:
name = ''
if source:
for item in items:
item = parser(item, name, source)
Run Code Online (Sandbox Code Playgroud)