当前位置: 首页 > 面试题库 >

如何判断发电机是否刚刚启动?

萧远
2023-03-14
问题内容

我想要一个函数,is_just_started其行为类似于以下内容:

>>> def gen(): yield 0; yield 1
>>> a = gen()
>>> is_just_started(a) 
True
>>> next(a)
0
>>> is_just_started(a) 
False
>>> next(a)
1
>>> is_just_started(a) 
False
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> is_just_started(a)
False

如何实现此功能?

我看了看.gi_running属性,但它似乎用于其他用途。

如果我知道需要发送到生成器的第一个值,则可以执行以下操作:

def safe_send(gen, a):
    try:
        return gen.send(a)
    except TypeError as e:
        if "just-started" in e.args[0]:
            gen.send(None)
            return gen.send(a)
        else:
            raise

但是,这似乎很可恶。


问题答案:

这仅适用于Python 3.2+:

>>> def gen(): yield 0; yield 1
... 
>>> a = gen()
>>> import inspect
>>> inspect.getgeneratorstate(a)
'GEN_CREATED'
>>> next(a)
0
>>> inspect.getgeneratorstate(a)
'GEN_SUSPENDED'
>>> next(a)
1
>>> inspect.getgeneratorstate(a)
'GEN_SUSPENDED'
>>> next(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration
>>> inspect.getgeneratorstate(a)
'GEN_CLOSED'

因此,请求的功能是:

import inspect

def is_just_started(gen):
    return inspect.getgeneratorstate(gen) == inspect.GEN_CREATED:

出于好奇,我研究了CPython以弄清它是如何确定的……显然,它看起来generator.gi_frame.f_lasti是“最后尝试的指令在字节码中的索引”。如果是,-1那么它还没有开始。

这是py2版本:

def is_just_started(gen):
    return gen.gi_frame is not None and gen.gi_frame.f_lasti == -1


 类似资料:
  • 问题内容: 我只是运行了一个简单的MySQL CREATE TABLE语句,该语句产生了这一行 “查询确定,受影响的行为0,警告为1(0.07秒)。” 但是,它实际上并没有告诉我警告是什么。您如何查看刚刚发生的警告的内容?我正在使用MySQL 5.1,如果有帮助的话。我在网上唯一发现的是“ SHOW WARNINGS;但这只会产生 “空集(0.00秒)。” 问题答案: 是我知道的唯一方法,但是必须

  • assertEquals(“Amsterdam,Noord-Holland”,Driver.FindElement(by.id(“van”)).getText()); 然而,这导致: org.junit.comparisonfailure:预期:<[荷兰阿姆斯特丹]>但实际:<[]> 所以看起来比较失败是正确的,但我不知道为什么我不能断言我在屏幕上看到的东西。 我正在使用Java、Selenium

  • 我刚刚从Windows 8升级到Windows 10(都是64位),我之前的带有用于Android开发的ADT插件的Eclipse Juno不再启动。 我所能看到的只是鼠标指针显示某些内容正在加载几秒钟,然后没有其他反应。 我所尝试的 < li >重命名< code>eclipse.ini以让它重新创建它:甚至没有重新创建它,所以将其重新命名。 < li >在Eclipse exe上打开了“Win

  • 问题内容: 如何撤消最近执行的mysql查询? 问题答案: 如果将表类型定义为InnoDB,则可以使用事务。您将需要set ,并且可以在发出之后或在查询或会话结束时提交或取消交易。

  • cmf_is_mobile() 功能 判断是否为手机访问 参数 无 返回 boolean

  • 问题内容: 如果所有数据被意外删除,是否可以将表恢复为上一次数据。 问题答案: 还有另一种解决方案,如果服务器上有活动的二进制日志,则可以使用 用它生成一个sql文件 然后搜索您缺少的行。如果您没有激活它,则没有其他解决方案。下次进行备份。

  • 我的angular应用程序使用了系列文章中概述的承载令牌http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/.我遵循分叉示例,在访问令牌过期时(通过401 http代码)无缝刷新令牌。 我的问题是,如何根据确定的角色来确定承载令牌是否过期或只是未经授权?

  • 问题内容: 有谁知道如何修理它。我正在使用Mac OS 10.8.2 问题答案: 在Python 3中是一个函数;它应该是: 正确安装或使用新版本(如果存在错误)。 在Python 3.3上工作正常。