带有类型提示的默认与可选函数参数

2024-09-28 01:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

因此函数gendata接受两个可选参数(namesource),然后根据source的值调用parser,调用的参数与该函数所需的参数相同

  1. 解决所需参数与非所需参数的推荐方法是什么
  2. Python文档中有一个关于typing.Types的示例,它表明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)

Tags: namepyparsersource参数typeargitem
1条回答
网友
1楼 · 发布于 2024-09-28 01:32:04

首先,关于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]'

参考: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,并放置一个默认字符串,如:

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)

相关问题 更多 >

    热门问题