![]() |
1
3
鉴于您愿意打破封装,我认为这是您所能做的最好的:
在Python中,判断某个东西是否有效的唯一方法是尝试它。这就是像Python一样动态的语言的本质。你的问题的困难在于你想区分“顶层”的失败和深层次的失败。
对于具有奇怪的自定义pickling逻辑的类型,这可能会给出可以证明是错误的否定。例如,如果您创建一个类似于自定义列表的类,而不是
另外,请注意
|
![]() |
2
1
考虑到Python的动态特性,我认为除了启发式或白名单之外,没有一种真正定义良好的方法来完成您所要求的任务。 如果我说:
x“原子可腌制”吗?如果我说:
? x现在是“原子泡菜”了吗? 如果我创建了一个始终具有lock属性的单独类呢?如果我从实例中删除了该属性怎么办? |
![]() |
3
1
我认为persistent_id接口与您尝试的不匹配。它设计用于当对象引用新程序上的等效对象,而不是旧程序的副本时。您正在尝试筛选出每个无法pickle的对象,这是不同的,为什么您要尝试这样做。 我认为这是你的代码有问题的迹象。事实上,您想要pickle引用gui小部件、文件和锁的对象,这表明您正在做一些奇怪的事情。通常持久化的对象类型不应该与此类对象相关或包含对此类对象的引用。 话虽如此,我认为你最好的选择是:
这应该对python实现有效,我不能保证C实现中会发生什么。保存的每个对象都将传递给save方法。当无法pickle对象时,此方法将引发PicklingError。此时,您可以介入并调用函数,要求它对您自己的对象进行pickle,该对象应该可以进行pickle。 编辑 据我所知,你基本上有一个用户创建的对象字典。有些对象是可拾取的,有些则不是。我将执行以下操作:
然后当你想保存对象集合时,使用字典。用户应该能够获取任何可拾取的对象,但其他所有对象都将作为Unpicklable()对象返回。这种方法与以前的方法的区别在于对象本身是可拾取的,但引用了不可拾取的对象。但不管怎样,这些东西很可能会破碎。 这种方法还有一个好处,那就是它完全保留在定义的API中,因此应该在cPickle或pickle中工作。 |
![]() |
4
0
我最终编写了自己的解决方案。
Here's the code
.
Here are the tests
. 它是
GarlicSim
,所以你可以通过
installing
如果要在Python3代码中使用它,请使用
Python 3 fork of
以下是模块摘录(可能已过时):
|
![]() |
5
0
好,
好吧,这失败了。现在,让我们调查一下:
好 啊。我们可以看到
现在我们的目标原子泡菜。 |