我可以记住 Python 生成器吗?

2024-01-04

我有一个函数叫做runquery它调用数据库,然后逐行生成行。我写了一个 memoize 装饰器(或者更准确地说,我只是从这个计算器问题 https://stackoverflow.com/questions/3377258/memoization-handler/3377272#3377272)但在后续调用中它只会产生一个空序列,大概是因为生成器的值只能产生一次。

如何修改适用于 Python 生成器的记忆装饰器?我意识到我需要在某个时候将它存储在内存中,但我想在装饰器中处理这个问题而不是修改原始函数。

记忆功能的当前代码是:

def memoized(f):
    # Warning: Doesn't work if f yields values
    cache={}
    def ret(*args):
        if args in cache:
            return cache[args]
        else:
            answer=f(*args)
            cache[args]=answer
            return answer
    return ret

我意识到这是一个老问题,但对于那些想要完整解决方案的人来说:这是一个基于 jsbueno 的建议的问题:

from itertools import tee
from types import GeneratorType

Tee = tee([], 1)[0].__class__

def memoized(f):
    cache={}
    def ret(*args):
        if args not in cache:
            cache[args]=f(*args)
        if isinstance(cache[args], (GeneratorType, Tee)):
            # the original can't be used any more,
            # so we need to change the cache as well
            cache[args], r = tee(cache[args])
            return r
        return cache[args]
    return ret
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以记住 Python 生成器吗? 的相关文章

随机推荐

  • 在 python 中使用 oauth2 服务帐户向 Google API 进行身份验证

    我已按照以下说明进行操作https developers google com accounts docs OAuth2ServiceAccount https developers google com accounts docs OAu
  • EntityManager 在 JBoss JSF bean 中的 merge() 上抛出 TransactionRequiredException

    我在 JBoss 5 0 1GA 上设置了一个 JSF 应用程序 以在表中显示用户列表 并允许通过每个用户旁边的按钮删除单个用户 当deleteUser被调用时 调用被传递到一个UserDAOBean 它获取从JBoss注入的EntityM
  • 詹金斯订书机请求失败,没有有效的面包屑

    我正在开发一个 Jenkins 插件 现在我陷入了一个困境 我试图使用 JavaScript 代理获取方法的返回值 如下所述here https wiki jenkins io display JENKINS AJAX with JavaS
  • 带有 LDAP 身份验证的 OWIN

    这是我的场景 我有一个使用 Owin 作为身份验证机制的 MVC 5 应用程序 默认模板在登录操作中调用 SignInManager PasswordSignInAsync 我想覆盖该操作以使用 LDAP 验证用户 而不是查看数据库 我可以
  • 如何同步一系列 Promise?

    我有一个 Promise 对象数组 必须按照它们在数组中列出的顺序来解析 即在前一个元素被解析之前我们不能尝试解析一个元素 作为方法Promise all does 如果一个元素被拒绝 我需要链立即拒绝 而不尝试解析下一个元素 我该如何实现
  • 编写 Spark 作业时是否有理由不使用 SparkContext.getOrCreate?

    我正在编写与 Datastax 中的 Cassandra 对话的 Spark 作业 有时 在执行 Spark 作业中的一系列步骤时 获取新 RDD 比加入旧 RDD 更容易 您可以通过调用来做到这一点SparkContext getOrCr
  • 在 MATLAB 中显示梯度图像的颤动图

    我有一个形象 我想显示使用 MATLAB 中的梯度函数获得的梯度图像的颤动图 最好叠加在梯度图像上 I imread image png gx gy gradient double rgb2gray I g abs gx abs gy fi
  • 具有安全用户身份验证和注册第三方应用程序的简单 PHP REST 服务器

    我正在考虑编写一个 PHP REST API 允许注册用户与第三方应用程序的 Web 服务进行交互 我需要 API 能够做的是 提供对安全用户身份验证的支持 允许注册用户与第三方应用程序的服务交互 该应用程序应事先在系统上注册并获得批准 类
  • 考虑重复,在数组中存储随机值

    这是一个新版本这个帖子 https stackoverflow com questions 4990164 estimating the probability of 3 people sharing a birthday为了将编程问题与概
  • 通用类的类助手?

    我正在使用 Delphi 2009 是否可以为通用类 即 TQueue 编写一个类帮助器 显而易见的 TQueueHelper
  • 如何从具有或不具有背景大小的文件夹创建精灵(使用指南针)

    我想将指南针生成的图标精灵用于两种不同的场景 使用原始大小的图标 使用 CSS3 属性使用与较小版本相同的图标background size 我首先这样做 logo spacing 20px import logo png include
  • NHibernate;删除子项也会删除父项吗?

    为什么是当我删除子级 员工 时 父级 商店 也被删除 我配置为约定 Cascade All The 用户输入序列很简单 从空数据库开始 添加家长 保存 加载 加载 重新加载完整对象图 添加一个孩子 保存 加载 删除子项 结果 数据库为空 父
  • Spotify 自动播放列表管理与 PHP 后端和速率限制

    两个问题 问题1 我们需要从我们的后端 PHP 管理 Spotify 用户的 4 个播放列表 无需用户登录 我们网站的访问者可以向我们的网站提交多首他们喜欢的歌曲 在此基础上 我们创建并管理 4 个播放列表 其中包含 提交最多的歌曲 我们希
  • 如何显示用户时区的时间

    我使用的是rails 3 0 5 并且已将created at 和updated at 存储在UTC 中 现在我想显示用户时区中的created at时间 我相信可以从浏览器中选择用户的时区 然后将时间转换为用户的时区 我确信 Rails
  • 使用 NPOI 将图像添加到 Word docx 文件

    我开始使用 NPOI 创建 Word 文档 并且尝试将简单的图像添加到文档中 但它没有显示 不过我可以让文字显示得很好 这是我的代码 var wDoc new XWPFDocument var bytes File ReadAllBytes
  • Android TV 中缺少应用栏的替代方案

    我只是注意到我的 Android 应用程序 当我运行它时 Android TV 带有后倾意图 但事实并非如此 显示菜单项的三明治按钮 This is missing and everthing else like the title 建议的
  • LINQ to XML 分组依据

    我想使用 LINQ 通过在 Summary 字段上执行 GROUPBY 并对 Balance 字段求和来将输入 XML 转换为输出 XML 输入 XML
  • Spring 3+ 当 JUnit 无法识别时如何创建 TestSuite

    我正在使用 Spring 3 0 4 和 JUnit 4 5 我的测试类当前使用 Spring 的注释测试支持 语法如下 RunWith SpringJUnit4ClassRunner class ContextConfiguration
  • 获得更干净的斑点以进行计数

    仍在学习图像遮蔽的旅程中 我正在尝试计算图像中红点的数量 Here is the input image After masking red I get this image 问题是 某些斑点未满 因此它不会计算所有斑点 例如在此特定图像中
  • 我可以记住 Python 生成器吗?

    我有一个函数叫做runquery它调用数据库 然后逐行生成行 我写了一个 memoize 装饰器 或者更准确地说 我只是从这个计算器问题 https stackoverflow com questions 3377258 memoizati