gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:16:10 27 4
gpt4 key购买 nike

所以函数gendata接受两个可选参数( namesource ),然后基于 source 的值调用 parser具有与此功能相同的参数。

  • 解决所需参数与不需要参数的推荐方法是什么?
  • Python 文档中有一个关于 typing.Types 的示例它表明 Type[SuperClass]应该接受从它继承的所有子类。为什么mypy在这种情况下提示,为什么只针对 arg 1 和 2 而不是 3 ( source )?

  • 示例.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 .

    例子:

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

    关于python - 带有类型提示的默认与可选函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60282100/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com