Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:使用函数参数持久记忆函数的策略?_Python_Functional Programming_Memoization_Object Persistence - Fatal编程技术网

Python:使用函数参数持久记忆函数的策略?

Python:使用函数参数持久记忆函数的策略?,python,functional-programming,memoization,object-persistence,Python,Functional Programming,Memoization,Object Persistence,我写了一个小类来持续记忆一些昂贵的函数,这些函数对随机网络进行各种统计分析 这些都是纯函数;所有数据都是不可变的。但是,有些函数将函数作为参数 基于这些参数生成键是一个小问题,因为在Python中,函数对象相等等同于函数对象标识,即使函数实现没有更改,函数对象标识在会话之间也不会持久存在 目前我正在使用函数名作为字符串来解决这个问题,但当人们开始考虑更改函数或匿名函数的实现时,这会引发一系列问题。但我可能不是第一个担心这些事情的人 在Python中,有没有人可以使用函数参数持久地记忆函数 看看如

我写了一个小类来持续记忆一些昂贵的函数,这些函数对随机网络进行各种统计分析

这些都是纯函数;所有数据都是不可变的。但是,有些函数将函数作为参数

基于这些参数生成键是一个小问题,因为在Python中,函数对象相等等同于函数对象标识,即使函数实现没有更改,函数对象标识在会话之间也不会持久存在

目前我正在使用函数名作为字符串来解决这个问题,但当人们开始考虑更改函数或匿名函数的实现时,这会引发一系列问题。但我可能不是第一个担心这些事情的人


在Python中,有没有人可以使用函数参数持久地记忆函数

看看如何使用它作为函数的标识

[getattr(func.__code__,s) 
 for s in ['co_argcount', 'co_cellvars', 'co_code', 'co_consts', 
           'co_filename', 'co_firstlineno', 'co_flags', 'co_freevars',
           'co_lnotab', 'co_name', 'co_names', 'co_nlocals', 'co_stacksize',
           'co_varnames']
]

这应该正确地处理以任何方式更改实现的问题…

一个选项是使用
封送.dumps(function.func\u code)


它将为函数的代码生成一个字符串表示。它应该能够处理不断变化的实现和匿名函数

@DanatheSane的可能重复项不是重复项——它不讨论函数作为已记忆函数参数的调用之间的持久记忆。谢谢。我认为像这样在“co_names”中的记忆函数上递归应该可以做到这一点。在我的初始测试中,许多不同平台和python版本中的“co_代码”都是相同的,这让我感到非常惊讶。我想我需要了解一下Python虚拟机。类似的东西对一般的可调用对象有用吗?虽然避免诸如全局名称之类的杂质是可以的,但是如果可以帮助的话,禁止使用除函数以外的任何可调用函数将是不可取的。@max no,不会的。一般来说,这样做是不可能的,因为在通用可调用的实现中构成更改的内容是由该可调用的类定义的。您最希望的是类是可拾取的或可封送的,这样在实现更改之间表示形式就不相同了。或者,您可以使用自己的协议来确定可调用函数实现的版本。好吧,我们不能重新定义内置
函数
对象的“无用”的
\uuuuuuuuu散列
\uuuuuuuuuuuu eq
方法,因此记忆程序必须递归地查看它们以确定它们是否发生了更改。但是对于可调用类,我们有更多的灵活性。所以我在想,如果要求它们都定义“有意义的”
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu散列
/
\uuuu。这种方法有效吗?当然,它会给可调用类实现者带来所有负担,但在某些情况下,实现者可能会发现这相当容易?@max它不一定会给函数实现带来任何负担---