- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用一个自定义 pickler,它根据 Shane Hathaway 的代码将任何不可 pickle 的对象(例如套接字或文件)替换为它们的字符串表示形式: Python: Pickling a dict with some unpicklable items
它在大多数情况下都有效,但是当我尝试取消 Django HttpResponse 时,我收到以下错误:UnpicklingError:NEWOBJ 类参数不是类型对象
我不知道该错误的实际含义。如果可以 pickle ,为什么不能解腌呢?我在 Google 上找到了三个对此错误的引用,但没有真正解释其发生原因或如何修复它。
这是我的代码:
from cPickle import Pickler, Unpickler, UnpicklingError
class FilteredObject:
def __init__(self, about):
self.about = about
def __repr__(self):
return 'FilteredObject(%s)' % repr(self.about)
class MyPickler(object):
def __init__(self, file, protocol=2):
pickler = Pickler(file, protocol)
pickler.persistent_id = self.persistent_id
self.dump = pickler.dump
self.clear_memo = pickler.clear_memo
def persistent_id(self, obj):
if not hasattr(obj, '__getstate__') and not isinstance(obj,
(basestring, bool, int, long, float, complex, tuple, list, set, dict)):
return ["filtered:%s" % str(obj)]
else:
return None
class MyUnpickler(object):
def __init__(self, file):
unpickler = Unpickler(file)
unpickler.persistent_load = self.persistent_load
self.load = unpickler.load
self.noload = unpickler.noload
def persistent_load(self, obj_id):
if obj_id[0].startswith('filtered:'):
return FilteredObject(obj_id[0][9:])
else:
raise UnpicklingError('Invalid persistent id')
###### serialize to file
f = open('test.txt','wb')
p = MyPickler(f)
p.dump(data)
f.close()
###### unserialize from file
f = open('test.txt','rb')
pickled_data = f.read()
f.seek(0)
u = MyUnpickler(f)
data = u.load()
最佳答案
成功的pickle分两步进行,pickler进行pickle.dump,Unpickler进行pickle.load。 Pickler 将对象转换为序列化格式(例如字符串),Unpickler 消化 pickled 对象并生成一个应该与原始对象等效的新对象。 Pickle 有几个可用于转储 pickles 的函数...因此第 1 部分是获取对象以转换为序列化格式。使用自定义 pickler,您可以绕过 python 的一些保护措施来 pickle pickle
本身无法 pickle 的对象。按照您的示例,我可以创建一个简单的 Pickler,通过将每个对象转换为其 __repr__
,将 lambda 等转换为字符串。
>>> x = lambda x:x
>>> repr(x)
'<function <lambda> at 0x4d39cf0>'
>>>
>>> import pickle
>>> l = repr(x)
>>> pickle.dumps(l)
"S'<function <lambda> at 0x4d39cf0>'\np0\n."
这肯定是可 pickle 的,因为它是一个字符串。然而,问题是如何从保存的字符串构建对象。对于 lambda,如果您有一个可以查找内存的函数字符串中注明的引用,您可以取回该对象...但前提是您仍然拥有该对象原始对象仍然存在于你的内存中……所以这不好。因此,只有当 __repr__
字符串中包含足够的信息以根据存储的字符串信息构建新对象时,转换为字符串的技巧才有效。您可能会对存储的内容更加感兴趣,但最终很可能会在将对象转换为字符串时遇到问题。因此,在这种情况下,您的 Pickler 可以工作,但您的 Unpickler 会失败。
字典的pickle很有趣,因为它们可以包含任何内容,而且通常很快就能完成。最讨厌的字典之一是 globals()
字典。要序列化它,我会使用 dill ,它几乎可以序列化 python 中的任何内容。
>>> import dill
>>>
>>> def foo(a):
... def bar(x):
... return a*x
... return bar
...
>>> class baz(object):
... def __call__(self, a,x):
... return foo(a)(x)
...
>>> b = baz()
>>> b(3,2)
6
>>> c = baz.__call__
>>> c(b,3,2)
6
>>> g = dill.loads(dill.dumps(globals()))
>>> g
{'dill': <module 'dill' from '/Library/Frameworks/Python.framework/Versions/7.2/lib/python2.7/site-packages/dill-0.2a.dev-py2.7.egg/dill/__init__.pyc'>, 'c': <unbound method baz.__call__>, 'b': <__main__.baz object at 0x4d61970>, 'g': {...}, '__builtins__': <module '__builtin__' (built-in)>, 'baz': <class '__main__.baz'>, '_version': '2', '__package__': None, '__name__': '__main__', 'foo': <function foo at 0x4d39d30>, '__doc__': None}
实际上,dill 将其类型注册到 pickle
注册表中,因此,如果您有一些使用 pickle
的黑盒代码,并且您无法真正编辑它,那么只需导入 dill 可以神奇地使其工作,而无需对第 3 方代码进行猴子修补。
或者,如果您希望将整个解释器 session 作为“python 图像”发送,dill 也可以做到这一点。
>>> # continuing from above
>>> dill.dump_session('foobar.pkl')
>>>
>>> ^D
dude@sakurai>$ python
Python 2.7.5 (default, Sep 30 2013, 20:15:49)
[GCC 4.2.1 (Apple Inc. build 5566)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> dill.load_session('foobar.pkl')
>>> c(b,3,2)
6
迪尔还有some good tools帮助您了解当代码失败时导致 pickle 失败的原因。
关于python - 取消 pickle 错误: NEWOBJ class argument isn't a type object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17519774/
所以 String 不是原始类型,而是一个类,类的对象通常必须以 Obj x = new Obj (); 的形式创建。但是,可以通过 String x = "..."; 创建字符串,这是首选方式,而不
众所周知,字符串是隐式实例化的,这意味着我们不必使用 new 来获取对对象的引用。 正因为如此,我一直相信框架会处理这个问题,因此如果我这样做,我会得到相同的 IL: String first = n
我正在深入研究 C#,并尝试使用可为 null 的值类型。只是出于实验目的,我写了一段代码: private static void HowNullableWorks() {
在 MonoTouch 下,以下代码行编译,但生成 InvalidProgramException: var bytes = new byte[,]{}; System.InvalidProgramE
当我执行波纹管时,出现 Unpickling 错误 rdd = sc.parallelize([('HOMICIDE', {'2017': 1}), ('DECEPTIVE PRACTICE', {'
我将 python 2.7 与 spark 1.5.1 一起使用,我得到了这个: df = sqlContext.read.parquet(".....").cache() df = df.filte
我有一个将构造函数包装在动态工厂方法中的方法: static Func ToFactoryMethod(this ConstructorInfo ctor) where TResult : c
我正在使用一个自定义 pickler,它根据 Shane Hathaway 的代码将任何不可 pickle 的对象(例如套接字或文件)替换为它们的字符串表示形式: Python: Pickling a
我遇到了一个非常奇怪的问题,使用spicy.spacial距离矩阵计算工作正常,但使用距离矩阵的自定义函数会导致Spark错误。 我的数据如下所示: 33.848366,-84.3733852,A,1
这里是一些用 C# 编写的测试程序: using System; struct Foo { int x; public Foo(int x) { this.x = x;
我是一名优秀的程序员,十分优秀!