python functools.singledispatch是否与生成器类型一起工作?

2024-10-05 14:23:51 发布

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

我在https://docs.python.org/3/library/functools.html#functools.singledispatch扩展了这个示例,为生成器类型添加了一个注册

from functools import singledispatch
from typing import Generator

@singledispatch
def fun(arg, verbose):
    if verbose:
        print("Let me just say,", end=" ")
    print(arg)

@fun.register
def _(arg: list, verbose):
    if verbose:
        print("Enumerate this:")
    for i, elem in enumerate(arg):
        print(i, elem)

# NEW CODE BELOW

@fun.register
def _(arg: Generator, verbose):
    if verbose:
        print("Enumerate this:")
    for i, elem in enumerate(arg):
        print(i, elem)

fun([3,4,5], verbose=True)
fun((i for i in range(6, 10)), verbose=True)

虽然它与list一起工作,但它似乎不与生成器一起工作,例如

    raise TypeError(
TypeError: Invalid annotation for 'arg'. typing.Generator is not a class.

是否预期singledispatch不能与生成器一起工作


Tags: infromimporttypingforverboseifdef
1条回答
网友
1楼 · 发布于 2024-10-05 14:23:51

typing.Generator是类型提示,而不是类型。您需要types.GeneratorType

from types import GeneratorType

@fun.register
def _(arg: GeneratorType, verbose):
    if verbose:
        print("Enumerate this:")
    for i, elem in enumerate(arg):
        print(i, elem)

根据isinstance,对象不被视为类型提示的实例,这是singledispatch用来决定对给定参数使用哪个函数的。通过此更改,您将获得预期的输出

$ python3 tmp.py
Enumerate this:
0 3
1 4
2 5
Enumerate this:
0 6
1 7
2 8
3 9

相关问题 更多 >