gpt4 book ai didi

python - python中函数对象的哈希值

转载 作者:行者123 更新时间:2023-12-01 09:06:35 25 4
gpt4 key购买 nike

让我解释一下为什么我需要这样做:

我正在开发一个库,并且需要序列化 ​​python 函数。

这是我使用的 2 个实用函数:

def serialize_func(fn: function) -> Tuple[bytes, str]:
return marshal.dumps(fn.__code__), fn.__name__


def deserialize_func(serialized_fn: Tuple[bytes, str]) -> function:
return types.FunctionType(
marshal.loads(serialized_fn[0]), globals(), serialized_fn[1]
)

现在,如果我可以缓存序列化函数,并将它们存储在 dict 中,如下所示:

Dict[function_hash, function]

{
<function hash>: <function>,
<function hash>: <function>,
...
}

这会带来相当大的性能提升,因为我不需要重复序列化(和传输)它们。

有可靠的方法来实现这一目标吗?

编辑:如果我尝试对函数进行哈希处理,这并不完全是我想要的。

In [1]: def x():
...: pass

In [2]: hash(x)
Out[2]: 8745212393041

In [3]: def x():
...: pass

In [4]: hash(x)
Out[4]: -9223363291642382793

我需要两个具有相同主体、签名、全局范围(以及我可能缺少的其他内容)的函数来返回相同的哈希值。

Here是有问题的库。

<小时/>

编辑:这是我为什么要这样做的一些深入解释。

我将函数从一个进程(“客户端”)发送到另一个进程(“服务器”),并在“服务器”上执行它。

听起来很奇怪而且复杂,但我有充分的理由。

这整个过程使函数在所有“客户端”之间严格原子化

“服务器”是“ Actor ”。因此,一次只能运行一个函数,使程序员更容易避免竞争条件。

现在,如果“客户端”已经将该函数发送到“服务器”一次,那么对于后续交互,它仅发送该函数的哈希值,并且“服务器”可以在中查找该函数它的表。

最佳答案

I need 2 functions with the same body, signature, global scope (and something else, which I'm probably missing) to return the same hash.

然后您必须根据这些标准自行构建哈希。

例如:

def foo(x):
return "It is " + str(x + 1)

def bar(x):
return "The answer is " + str(x + 2)

def quux(x):
return "The answer is " + str(x - 2)


def fnhash(f):
c = f.__code__
return hash((c.co_argcount, c.co_code))

fnhash(foo)
# => -640999299468968616
fnhash(bar)
# => -640999299468968616
fnhash(quux)
# => -1235803056671018747

请注意,第一个是相同的,因为代码和位置参数的数量是相同的 - 我们没有包含 co_consts ,所以不同的字符串和变化 12不被考虑在内。请注意,最后一个有所不同,因为我们更改了操作(影响了 co_code ,进而影响了 fnhash )。

您可以准确选择代码对象的哪些属性是有意义的(例如,我怀疑您会想要包含 co_filenameco_firstline )。查看各种co_*的含义字段 in the inspect docs .

关于python - python中函数对象的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51998631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com