在Python中,有什么方法可以测试生成器对象以找出创建它的生成器?

萨汉德

给定一个生成器对象,是否可以测试它是否由给定的生成器创建?也许更好地说,是否有可能测试我们拥有的发电机的“类型”?由于生成器对象的类型为generator,因此使用type进行测试均isinstance无效。

考虑下面的代码:

>>> def gen1():
...     yield 1
... 
>>> def gen2():
...     yield 2
... 
>>> g1 = gen1()
>>> g2 = gen2()
>>> 
>>> def do_something(f):
...     # need to know if f is a gen1 generator or a gen2 generator here
...     # isinstance(f, gen1)  raises a TypeError since gen1 is not a type
...     # type(f) is gen1 returns false
...     print(f)
... 
>>> do_something(g1)
<generator object gen1 at 0x100dcb370>
>>> do_something(g2)
<generator object gen2 at 0x100dcb3c0>

需要注意的是,如果我是使用迭代器类,而不是实现发电机,那么这两个typeisinstance会的工作,因为生成的对象将是由迭代器类所给出的类型:

>>> class gen():
...     def __next__(self):
...          return 1
... 
>>> f = gen()
>>> type(f) is gen
True
>>> isinstance(f, gen)
True

是否可以通过使用创建的生成器以简单的方式(例如不将生成器包装在类中或使用装饰器之类的方式)实现相同目的yield

威姆

生成函数的名称(如果有)__name__以字符串形式存储在属性中。如果只需要字符串,就可以完成。

要获得实际的功能对象,这很复杂。生成器本身不保存对功能对象的任何引用,并且逻辑使用对代码对象的引用进行操作。

function object (`gen1`) -----> <code object >
                                    ^
generator object (`g1`)  -----------╯

怀着生成器函数的原始名称,可以想象,您可以getattr在包含模块上使用它来尝试检索原始函数。该方法不一定可靠:这里假设函数对象仍然存在,并且仍然绑定到该名称。但是,该名称可能已被删除或重新绑定。在CPython中,如果引用计数减少到0,则该函数也可能已经被垃圾回收。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

生成器在Python中具有什么类型签名?

来自分类Dev

如何在生成器中创建生成器 - Python

来自分类Dev

python中生成器对象的大小

来自分类Dev

生成器与序列对象

来自分类Dev

生成器与序列对象

来自分类Dev

从生成器创建列表

来自分类Dev

类中的方法可以生成器吗?

来自分类Dev

类中的方法可以生成器吗?

来自分类Dev

Python:检查生成器中是否存在对象

来自分类Dev

TT生成器中的辅助方法

来自分类Dev

有什么方法可以创建异步流生成器,从而产生重复调用函数的结果?

来自分类Dev

为什么未在Python生成器中捕获异常?

来自分类Dev

Python中的生成器和for循环

来自分类Dev

Python中的生成器用法

来自分类Dev

Python生成器中的意外输出

来自分类Dev

Python中的快速组合生成器

来自分类Dev

在python中深度复制生成器

来自分类Dev

终端中的Python质数生成器

来自分类Dev

Python生成器中的参数检查

来自分类Dev

递归函数中的python生成器

来自分类Dev

Python中的字典生成器

来自分类Dev

在Python生成器中反转next()

来自分类Dev

理解 Python 中的生成器函数

来自分类Dev

python中的偶数生成器

来自分类Dev

python中的迷宫生成器

来自分类Dev

为什么python3.6可以从非协程生成器中的协程对象产生?

来自分类Dev

从生成器调用生成器

来自分类Dev

列出的Python生成器

来自分类Dev

Python报表生成器