gpt4 book ai didi

python - 具有类型类型的 singledispatchmethod

转载 作者:行者123 更新时间:2023-12-04 13:55:49 26 4
gpt4 key购买 nike

在 Python 3.8 中,创建了一个用于创建多态函数的新装饰器 @singledispatchmethod,它根据提供的类型提示将 Python 重定向到您的方法的正确实现。
但是,我似乎无法使用类型模块中的复杂类型,请您告诉我我的示例有什么问题?

from typing import List
from functools import singledispatchmethod
class test:
@singledispatchmethod
def a(self, a):
return NotImplemented

@a.register
def _(self, a : str):
print(type(a))

# Uncomment to run the example
# @a.register
# def _(self, a: List[str]):
# print(type(a))

def b(self, b: List[str]):
print(type(b))

test().a(["A"])
test().b(["A"])
如果取消注释第二个下划线函数的注释,则 a 函数会发生以下错误,即使它没有发生在 b 函数中:
TypeError: Invalid annotation for 'a'. typing.List[str] is not a class.
我究竟做错了什么?

最佳答案

从评论来看,似乎有 potential changessingledispatchmethod ,但如果您对可用的变通方法感兴趣,以允许调度和输入工作,这里有一些选项:

  • 使用实际类注册重载 list然后为重载提供更具体的类型提示 ( see related answer )。
  • 使用类似 multimethod 的项目处理更多参数化 typing类型。

  • 选项1:注册 list并添加更具体的重载类型提示
    from functools import singledispatchmethod
    from typing import List, overload


    class test:
    @singledispatchmethod
    def overloaded_a(self, a):
    return NotImplemented

    @overloaded_a.register
    def _(self, a: str):
    print(type(a))

    @overloaded_a.register
    def _from_list(self, a: list):
    print(type(a))

    @overload
    def a(self, a: str): ...

    @overload
    def a(self, a: List[str]): ...

    def a(self, *args, **kwargs):
    return self.overloaded_a(*args, **kwargs)

    def b(self, b: List[str]):
    print(type(b))


    test().a(["A"])
    test().b(["A"])
    test().a("this")
    # test().a([34]) # mypy error: List item 0 has incompatible type "int"; expected "str"
    # test().b("this") # mypy error: Argument 1 to "b" of "test" has incompatible type "str"; expected "List[str]"
    选项 2:使用 multimethod
    from typing import List

    from multimethod import multimethod as singledispatchmethod


    class test:
    @singledispatchmethod
    def a(self, a):
    return NotImplemented

    @a.register
    def _(self, a: str):
    print("str")
    print(type(a))

    @a.register
    def _from_str_list(self, a: List[str]):
    print("str list")
    print(type(a))

    @a.register
    def _from_int_list(self, a: List[int]):
    print("int list")
    print(type(a))

    def b(self, b: List[str]):
    print(type(b))


    test().a(["A"])
    test().a([3])
    test().b(["A"])
    # test().b(3) # mypy error: Argument 1 to "b" of "test" has incompatible type "int"; expected "List[str]"

    关于python - 具有类型类型的 singledispatchmethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62700774/

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