Определение генератора классов - PullRequest
2 голосов
/ 25 октября 2019

Почему inspect.isgenerator () возвращает false для этого определения генератора классов (работает в python 3.7)?

Я знаю, что isgenerator проверяет, является ли объект типа

"generator" 

и мой класс типа

"__main__.generator" 

, который я не знаю почему. Как мне сделать это типа "генератор"? (Мне нужно это из-за какой-то другой 3-й библиотеки, которая проверяет это).

class generator(object):
  def __init__(self):
    pass
  def __getitem__(self, index):
    return [0,0]

  def __iter__(self):
    return self  

  def __next__(self):
    return [0,0]

  def next(self):
      return self.__next__()  

a = generator()

import inspect
print(inspect.isgenerator(a))
print(type(a))

спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

«Генератор» - это определенный встроенный тип, и ваш тип никогда не будет таким, независимо от того, какие методы вы реализуете или какое имя вы ему даете. Вы не можете сделать экземпляры вашего класса фактическими генераторами. (Даже через подклассы - реальный тип генератора не может быть разделен на подклассы.) Кроме того, генераторы имеют методы send и throw, используемые для функциональности сопрограмм , но для вашего класса не имеет смысла иметьте, и их реализация по-прежнему не заставит ваши объекты проходить inspect.isgenerator.

inspect.isgenerator предназначен для проверки фактического генератора, а не произвольных итераторов или объектов, имитирующих генераторы.

Еслииспользуемая сторонняя библиотека нуждается в реальном генераторе, вам нужно будет предоставить ей фактический генератор, написав и вызвав функцию генератора или написав выражение генератора.

Если стороннийбиблиотека на самом деле не нуждается ни в чем специфичном для генератора, вы можете подать проблему с просьбой переключиться на менее строгую проверку, чем inspect.isgenerator.

0 голосов
/ 25 октября 2019

Генератор не может быть разделен на подклассы. Если вы просто хотите пройти тест inspect.isgenerator добавьте в свой класс:

import types
class generator(object):
    ...
    @property
    def __class__(self):
        # maybe condition with caller
        return types.GeneratorType

...
print(inspect.isgenerator(a)) # True
...