首页 > 解决方案 > Python如何在对象内找到所有不可腌制的项目

问题描述

我有一个使用多处理的程序。我正在尝试使用 multiprocessing.Queue() 在每个进程之间共享信息。此队列不处理不可拾取的项目。我已经进行了一些鸭子测试以检查对象是否可拾取,并手动检查对象以找到不可拾取的项目。有没有办法找到所有不可挑选的项目并将其删除,而不是手动执行此操作?找到不可拾取项目的原因是它可以被删除,对象不会有问题被传递到队列中。

这是代码的精简版本:

# Test that object is pickle-able so results can be transferred
# Exception will be raised if not pickle-able
pickle.dumps(shareInfoObject)

mpQueue.put_nowait(shareInfoObject)

标签: pythonpickle

解决方案


我不确定“找到所有不可腌制的物品”是什么意思。这是一个检查给定对象是否可腌制的函数:

import pickle
def pickleable(obj):
    try:
        pickle.dumps(obj)
    except pickle.PicklingError:
        return False
    return True

# Test
import os
print(pickleable(42))  # True
print(pickleable(os))  # False

在 Python 2 中,可能会得到与 不同的错误pickle.PicklingError,因此更健壮(尽管不太小心)的选项是仅用于except:捕获任何异常。


推荐阅读