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

是否有一种简单的方法来腌制python函数(或以其他方式序列化其代码)?

岳曦
2023-03-14
问题内容

我正在尝试通过网络连接(使用异步)传输功能。是否有一种简单的方法可以序列化python函数(至少在这种情况下不会产生副作用),以便像这样进行传输?

理想情况下,我希望有一对类似于以下的函数:

def transmit(func):
    obj = pickle.dumps(func)
    [send obj across the network]

def receive():
    [receive obj from the network]
    func = pickle.loads(s)
    func()

问题答案:

您可以序列化函数字节码,然后在调用方上对其进行重构。所述编组模块可以用于串行化处理的代码对象,然后可将其重新组装成一个函数。即:

import marshal
def foo(x): return x*x
code_string = marshal.dumps(foo.func_code)

然后在远程过程中(在传输code_string之后):

import marshal, types

code = marshal.loads(code_string)
func = types.FunctionType(code, globals(), "some_func_name")

func(10)  # gives 100

一些警告:

  • 元帅的格式(与此有关的任何python字节码)在主要python版本之间可能不兼容。

  • 仅适用于cpython实现。

  • 如果该函数引用了您需要使用的全局变量(包括导入的模块,其他函数等),则也需要对它们进行序列化,或在远程端重新创建它们。我的示例只是为它提供了远程进程的全局名称空间。

  • 您可能需要做更多的工作来支持更复杂的情况,例如闭包或生成器函数。



 类似资料:
  • 问题内容: 我正在尝试将长度不定的多个数据列表输出到CSV文件。每个列表应该是输出CSV文件中的一列。有直接的做事方法吗?如果我将每个列表输出为一行,那么我将遍历每个列表并在结束时输出返回值,但是这种方法在按列工作时不起作用。 我曾想过一次逐项检查所有列表并增加一个计数器,但这也会失败,因为有些列表比另一些​​更长。为了解决这个问题,我将不得不在每次迭代时检查计数器是否在每个列表的末尾,这在计算方

  • 我知道苹果发布了基于蓝牙4.0协议的iBeacon。 在任何蓝牙设备中,如果我们使用以下代码对设备进行编码: 表示呈现此蓝牙设备是iBeacon蓝牙设备。 我的问题是,如果我定义了自己的协议,这意味着我会改变它 是否有一种可能性,我可以通过iphone识别我自己定义的蓝牙设备,而无需在iphone上添加识别设备。 苹果是否支持定制ibeacon? 编辑根据davidgyoung所说,我对stack

  • 问题内容: 作为此问题的后续措施: 是否有一种简单的方法来腌制python函数(或以其他方式序列化其代码)? 我想从上面的帖子中看到此项目符号的示例: “如果函数引用需要拾取的全局变量(包括导入的模块,其他函数等),则也需要对它们进行序列化,或在远程端重新创建它们。我的示例只是为它提供了远程进程的全局命名空间。 ” 我有一个简单的测试,可以使用marshal将功能字节代码写入文件: 然后启动一个新

  • 问题内容: 来自Gson项目的此链接似乎表明,将类型化的Map序列化为JSON时,我将必须执行以下操作: 很酷,这行得通,但是似乎有很多开销( 整个Type Adapter类? )。我使用了其他JSONLib之类的JSON库,它们使您可以通过以下方式构建地图: 或者,如果我有一个自定义类,则如下所示: 该过程更加手动,但是所需的代码更少,并且没有开销来为Number创建自定义类型适配器,或者在大多

  • 本文向大家介绍python-requests 其他要求方式,包括了python-requests 其他要求方式的使用技巧和注意事项,需要的朋友参考一下 示例 该requests模块具有用于大多数HTTP方法的顶级功能:            

  • 问题内容: 我正在尝试捕获WebBrowser控件的内容。可以完美地工作,但是WebBrowser控件的文档中不支持它。我一直在尝试寻找另一种捕获WebBrowser控件的内容并将其保存到本地图像文件的方法。 是否有人有任何变通办法或其他方法将WebBrowser控件的内容保存到本地图像文件? 问题答案: Control.DrawToBitmap并不总是能正常工作,因此我诉诸于以下提供更一致结果的