【问题标题】:Class generator definition类生成器定义
【发布时间】:2020-02-21 17:17:14
【问题描述】:

为什么 inspect.isgenerator() 对此类生成器定义返回 false(在 python 3.7 中工作)?

我知道 isgenerator 正在检查对象类型的天气

"generator" 

我的班级属于

类型
"__main__.generator" 

我不知道为什么。如何使其成为“生成器”类型? (我需要这个,因为其他第三个图书馆正在检查这个)。

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

感谢您的帮助!

【问题讨论】:

  • @MadPhysicist:不重复,因为实现生成器 API 的其余部分不会使类通过 inspect.isgenerator

标签: python python-3.x generator


【解决方案1】:

Generator cant be subclassed.如果你只是想通过测试inspect.isgenerator添加到你的类:

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

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

【讨论】:

  • 我特别避免在我的回答中加入这样的内容,因为它更有可能导致问题而不是解决问题。
【解决方案2】:

“生成器”是一个特定的内置类型,无论你实现什么方法或给它起什么名字,你的类型永远不会是那个类型。你不能让你的类的实例成为实际的生成器。 (甚至不能通过子类化——真正的生成器类型不能被子类化。)另外,生成器有用于coroutine functionalitysendthrow 方法,但是你的类拥有这些并实现它们是没有意义的仍然不会让你的对象通过inspect.isgenerator

inspect.isgenerator 旨在检查实际生成器,而不是任意迭代器或模仿生成器的对象。

如果您使用的第三方库需要一个真正的生成器,您必须通过编写和调用生成器函数或编写生成器表达式来为其提供一个实际的生成器。

如果第三方库实际上不需要任何特定于生成器的内容,您可以提出问题,要求他们切换到比inspect.isgenerator 限制更少的检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多