当前位置: 首页 > 知识库问答 >
问题:

顶级课可以腌制和不腌制吗(留档错了?)

徐昆
2023-03-14

下面链接的文档似乎表明可以对顶级类及其实例进行pickle处理。但根据我对前一个问题的回答来看,这似乎不正确。在我发布的脚本中,pickle接受类对象并写入文件,但这没有用。

这是我的问题:这个文档是错误的,还是有更微妙的东西我不明白?另外,在这种情况下,泡菜是否应该生成某种错误消息?

https://docs . python . org/2/library/pickle . html # what-can-pickle-and-un pickle,

以下类型可以腌制:

  • 无、真和假
  • 整数、长整数、浮点数、复数
  • 普通字符串和统一码字符串
  • 仅包含可拾音对象的元组、列表、集和字典
  • 在模块的顶层定义的函数
  • 在模块的顶层定义的内置函数
  • 在模块的顶层定义的类(我的粗体)
  • 此类类的实例,其字典或调用 getstate() 的结果

共有2个答案

拓拔嘉颖
2023-03-14

完全有可能在python中腌制一个类实例...同时还保存代码以重新构造类和实例的状态。如果您想在泡菜之上破解解决方案,或者使用基于“特洛伊木马”执行的方法,以下是操作方法:

如何取消其类存在于不同命名空间(python)中的对象?

或者,如果您使用dill,您有一个dumpfunction,它已经知道如何存储类实例、类代码和实例状态:

如何恢复pickle类及其实例

Pickle python类实例加定义

我是dill作者,我创建dill部分是为了能够跨多重处理运送类实例和类方法。

腌制不了

甄正信
2023-03-14

创建一个在模块的顶层定义的类:

foo.py:

class Foo(object): pass

然后运行一个单独的脚本,

script.py:

import pickle
import foo


with open('/tmp/out.pkl', 'w') as f:
    pickle.dump(foo.Foo, f)

del foo

with open('/tmp/out.pkl', 'r') as f:
    cls = pickle.load(f)

print(cls)

印刷品

<class 'foo.Foo'>

请注意,pickle文件< code>out.pkl仅包含命名定义模块和类名的字符串。它不存储类的定义:

cfoo
Foo
p0
.

因此,在解压定义模块时,foo必须包含类的定义。如果从定义模块中删除类

del foo.Foo

然后你会得到错误

AttributeError: 'module' object has no attribute 'Foo'
 类似资料:
  • 问题内容: 我有一个defaultdict看起来像这样: 问题是,我不能使用cPickle腌制它。我在这里找到的解决方案之一是使用模块级函数而不是lambda。我的问题是,什么是模块级功能?如何在cPickle中使用字典? 问题答案: 除了Martijn的解释之外: 模块级函数是在模块级定义的函数,这意味着它不是类的实例方法,它不嵌套在另一个函数中,并且它是带有名称的“真实”函数,而不是lambd

  • 我用PHPass散列密码已经很久了。我承认仍然有一些我不完全理解(或忽略)的东西来正确地散列密码,所以今天我查看了所有我能找到的关于它的信息。 回顾PHPass文档,我已经进入了这个: 除了实际的哈希之外,phpass 在对新密码或密码进行哈希处理时会透明地生成随机 salt,并将哈希类型、salt 和密码拉伸迭代计数编码到它返回的“hash 编码字符串”中。当phpass根据存储的哈希对密码或密

  • 问题内容: Windows上的Python 3.5,请尝试以下操作: 引发异常: multiprocessing.Process的子类抛出相同的异常: 问题答案: 这样的事情应该起作用: 基本上,a需要a ,并且由于任何原因,实例被腌制时都不会保存(例如,不在方法中)。如果您需要更多的状态(即其他并从方法),那么你就需要从扩展的返回值上述功能。(请注意,如果您使用的是python 2.x,则相应的

  • 问题内容: 最近,有人提出了一些Python代码试图通过使用腌制过程促进分布式计算的问题。显然,该功能在历史上是可能的,但是出于安全原因,该功能被禁用。第二次尝试通过套接字传输功能对象时,仅传输了引用。如果我错了,请纠正我,但我不认为此问题与Python的后期绑定有关。假定不能腌制进程和线程对象,是否有任何方法可以传输可调用对象?我们希望避免为每个作业传输压缩的源代码,因为这可能会使整个尝试变得毫

  • 问题内容: Python的pickle(我在这里说的是标准的Python 2.5 / 2.6 / 2.7)不能腌制锁,文件对象等。 它也不能腌制生成器和lambda表达式(或任何其他匿名代码),因为腌制实际上仅存储名称引用。 在锁和依赖于操作系统的功能的情况下,原因 为何 你不能咸菜他们是明显的,是有道理的。 但是 为什么不能腌制发电机呢? 注 :只是为了清楚起见, -我有兴趣的根本原因(或假设和

  • 问题内容: 我已经根据numpy文档创建了numpy ndarray的子​​类。特别是,我通过修改提供的代码添加了自定义属性。 我正在使用Python在并行循环中处理此类的实例。据我了解,将范围本质上“复制”到多个线程的方法是使用。 我现在要面对的问题与numpy数组的腌制方式有关。我找不到关于此的任何综合文档,但是莳萝开发人员之间的一些讨论建议我应该专注于该方法,该方法在腌制时被调用。 谁能进一