关于generator:python isinstance(obj,tpyes.GeneratorType)失败

python isinstance(obj, tpyes.GeneratorType) fails

如果我检查类型types.GeneratorType和生成器对象text[0],每个都返回。然而,每当我使用isinstance()时,它会返回False。我做错什么了?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import types
import spacy

nlp = spacy.load('en')
text = [nlp(' '.join(docs)).sents]

print(types.GeneratorType)

Out[27]: <class 'generator'>


print(text)
Out[28]: [<generator object at 0x000001F4407F8950>]

print(type(text[0]))
Out[29]: <class 'generator'>


print(isinstance(text[0], types.GeneratorType))
Out[30]: False


您的代码读起来有点混乱,因为变量text是一个包含生成器对象的列表。但我认为您在这里看到的是一个相当微妙的区别:在Python中生成器函数和生成器之间的区别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import types
import inspect

def generator_function():
    for i in range(100):
        yield i

generator = (i for i in range(100))

isinstance(generator_function, types.GeneratorType)  # False
isinstance(generator, types.GeneratorType)  # True

inspect.isgeneratorfunction(generator_function)  # True
inspect.isgeneratorfunction(generator)  # False

spacy的Doc.sents属性是一个生成句子跨度的生成器函数——有关实现,请参见此处。