跳转到主要内容

半透明持久对象

项目描述

持久化:Python 对象的自动持久化

https://github.com/zopefoundation/persistent/actions/workflows/tests.yml/badge.svg https://coveralls.io/repos/github/zopefoundation/persistent/badge.svg?branch=master Documentation Status Latest release Python versions

此软件包包含 Python 的通用持久化实现。它构成了使对象与数据库(如 ZODB)透明交互的核心协议。

有关更多信息,请参阅 Sphinx 文档(docs/index.rst),或查看 Read The Docs 上的文档,无论是最新版本(https://persistent.readthedocs.io/en/latest/)还是稳定版本(https://persistent.readthedocs.io/en/stable/)。

持久化 更新日志

6.1 (2024-09-17)

6.0 (2024-05-30)

  • 停止支持 Python 3.7。

  • 在 GHA 上构建 Windows 轮子。

5.2 (2024-02-16)

  • 添加对 Python 3.13a3 的初步支持。

5.1 (2023-10-05)

  • 添加对 Python 3.12 的支持。

5.0 (2023-01-09)

  • 为 Python 3.11 构建 Linux 二进制轮子。

  • 停止支持 Python 2.7、3.5、3.6。

4.9.3 (2022-11-16)

  • 添加在 macOS 上构建 arm64 轮子的支持。

4.9.2 (2022-11-03)

  • 将 Python 3.11 的支持更新到最终版本。

4.9.1 (2022-09-16)

  • 将 Python 3.11 的支持更新到 3.11.0-rc1。

  • 在 C 代码中禁用不安全的数学优化。请参阅 pull request 176

4.9.0 (2022-03-10)

  • 添加对 Python 3.11(自 3.11a5 以来)的支持。

4.8.0 (2022-03-07)

  • 将软件包切换到 src-layout,这是一个仅限包装的更改。(#168

  • 添加对 Python 3.10 的支持。

4.7.0 (2021-04-13)

  • 添加对 Python 3.9 的支持。

  • 从 Travis CI 切换到 Github Actions。

  • 提供适用于 aarch64(ARM)的 manylinux 轮子。

  • 修复了纯 Python 实现以在设置其 __class____dict__ 时激活幽灵对象。这符合 C 实现的行为。请参阅 问题 155

  • 修复了 CFFI 缓存实现(在 PURE_PYTHON=1 时用于 CPython)以不在垃圾回收期间打印来自 _WeakValueDictionary 的不可恢复的 AttributeErrors。请参阅 问题 150

  • 使纯 Python 缓存实现运行垃圾回收(gc.collect())在 full_sweepincrgcminimize 上,如果它检测到被弱引用的对象被弹出。这解决了 PyPy 上的问题,其中 ZODB 在注册了持久 zope.interface 工具/适配器时会引发 ConnectionStateError。这部分撤销了 4.2.3 版本中的更改。

4.6.4 (2020-03-26)

  • 修复了使用 zope.interface 5 的过度具体的测试失败。请参阅 问题 144

  • 修复了可能由于晦涩的错误而产生的两个引用泄漏。请参阅 问题 143

4.6.3 (2020-03-18)

  • 修复了在 32 位 CPython 的某些 32 位平台上测试套件中的崩溃。请参阅 问题 137。由 Jerry James 修复。

4.6.2 (2020-03-12)

  • 修复了清除无连接的、非空 PersistentMapping 时抛出的 AssertionError。请参阅 问题 139

4.6.1 (2020-03-06)

  • 停止在 PyPy 上安装 C 头文件(这是 persistent 在 4.6.0 之前所做的),修复了 问题 135

4.6.0 (2020-03-05)

  • 修复了 PersistentList 的切片操作,使其始终返回同一类的实例。在 Python 3 早期版本(3.7.4 之前)存在问题。

  • 修复了使用 copy.copy 复制 PersistentListPersistentMapping 时,同时复制底层数据对象的问题。在 Python 3.7.4 之前存在问题。

  • 更新了对 PURE_PYTHON 环境变量的处理。现在,值为“0”要求使用 C 扩展;任何其他非空值将阻止使用扩展。此外,所有 C 扩展必须一起使用,否则将不使用任何扩展。这防止了由于 Python 和 C 实现不匹配而产生的奇怪错误。请参阅 问题 131

    注意,某些私有实现细节,如纯 Python 实现的名称已更改。

  • 修复了 PersistentList,在调用 clear(如果需要)后将其标记为已更改。请参阅 PR 115

  • 修复了 PersistentMapping.update,使其可以接受与原生 UserDict 一样的关键字参数。之前,大多数使用关键字参数的用法会导致 TypeError;在文档未记载且极为罕见的情况下,当单个关键字参数名为 b 且恰好是字典时,其行为将改变。同时调整 setdefaultpop 的签名以匹配原生版本。

  • 修复了 PersistentList.clearPersistentMapping.clearPersistentMapping.popitem,在对象为空时不再将其标记为已更改。

  • 为 Python 3.9a3+ 添加初步支持。请参阅 问题 124

  • 修复了 PickleCache 的 Python 实现以存储无法进行弱引用的对象。请参阅 问题 133

    注意,使用 Python 实现时需要 ctypes(在 PyPy 上除外)。

4.5.1 (2019-11-06)

  • 添加了对 Python 3.8 的支持。

  • 更新文档以支持 Python 3。

4.5.0 (2019-05-09)

  • 完全测试了 PickleCache 的 C 实现并与 Python 实现之间的差异进行了修复。

    • C 实现现在对于某些类型的错误输入会抛出 ValueError 而不是 AssertionError

    • Python 实现使用 C 中的错误消息用词。

    • C 实现正确实现了 IPickleCache;Python 实现特有的方法已移动到 IExtendedPickleCache

    • 如果持久化类没有 p_jar 属性,Python 实现将抛出 AttributeError

    请参阅 问题 102

  • 允许在无需 cache_size 的情况下清除缓存。当 cache_size_bytescache_size=0 一起使用时,无需将 cache_size 设置为较大值。

  • 在 CPython 上要求纯 Python 操作使用 CFFI。这取消了 Jython 的支持(它未经过测试)。请参阅 问题 77

  • 修复了关于 PY_SSIZE_T_CLEAN 的弃用警告。请参阅 问题 108

  • 取消对 Python 3.4 的支持。

4.4.3 (2018-10-22)

  • 修复持久化对象的repr,使其在使用C扩展时包含模块名称。这符合纯Python行为和4.4.0之前的版本行为。请参阅问题92

  • 将持久化对象的repr更改为将OID格式化为十六进制整数,如果它是一个8字节的字节串,就像ZODB所做的那样。这消除了doctests中的一些问题。请参阅问题95

4.4.2 (2018-08-28)

  • 显式使用无符号常量对C时间戳进行打包和拆包,修复了GCC在启用优化且启用-fwrapv时出现的算术问题。请参阅问题86

4.4.1 (2018-08-23)

  • 修复在PyPy上安装源代码包的问题。请参阅问题88

4.4.0 (2018-08-22)

  • 在执行C时间戳的算术运算时使用无符号常量,可能避免了某些编译器或编译器设置的一些溢出问题。请参阅问题86

  • Persistent对象的默认表示形式更改为包括其OID和jar(如果已设置)的表示。还允许子类实现_p_repr()而不是覆盖__repr__,以更好地处理异常。请参阅问题11

  • 达到并维持100%的测试覆盖率。

  • 简化__init__.py,包括删除对persistent.TimeStamp的尝试性旧导入。请参阅PR 80

  • 添加对Python 3.7的支持,并停止支持Python 3.3。

  • 当CFFI可用时,在安装或wheel构建时间构建CFFI模块(在PyPy上使用或在PURE_PYTHON设置时使用)。这取代了在导入时构建它们的已弃用方式。如果分发二进制wheel,则消除了使用PyPy时需要功能齐全的C编译器的需求。请参阅问题75

  • 修复在对象处于缓存中时删除纯Python持久化对象中的_p_oid的问题。

  • 修复删除覆盖__delattr__的特殊(_p)属性,并正确调用_p_delattr的纯Python持久化对象的问题。

  • 删除一些不再必要的内部兼容性衬垫。请参阅PR 82

  • 当从6个浮点秒参数创建TimeStamp时,使C和Python实现返回TimeStamp.second()的值保持一致。还要使其在通过TimeStamp.raw()的往返中保持一致。之前,C版本可能会出现错误的舍入和过多的虚假精度,而Python版本可能会有过多的精度。原始/repr值没有改变。请参阅问题41

4.3.0 (2018-07-30)

  • 修复在释放项时C扩展可能发生的罕见崩溃。请参阅https://github.com/zopefoundation/persistent/issues/66

  • 更改cPickleCache比较对象大小以确定对象是否可以进入缓存的比较方法,使用PyObject_TypeCheck()。这与纯Python实现的行为一致,并且是一个更强的测试,以确保对象真的与缓存兼容。之前,一个对象可能包含cPersistent_HEAD且未将tp_base设置为cPersistenceCAPI->pertype,但仍符合pickle缓存资格;现在不再是这样了。请参阅问题69

4.2.4.2 (2017-04-23)

  • 仅打包发布:修复Python 2.7 manylinux wheel。

4.2.4.1 (2017-04-21)

  • 仅打包发布版:自动构建 manylinux 轮子。

4.2.4 (2017-03-20)

  • setstate 中加载具有生成异常(如 ZODB 的 POSKeyError)的槽的对象时,避免抛出 SystemError: error return without exception set

4.2.3 (2017-03-08)

  • 修复了 64 位 Windows 上 Python 的 TimeStamp 对象的散列码。参见 https://github.com/zopefoundation/persistent/pull/55

  • 在纯 Python 模式(PyPy)中,每次调用 PickleCache.incrgc(每个事务边界)时停止调用 gc.collect。这意味着缓存的报告大小可能不正确(直到下一次 GC),但速度更快。这不应该对用户代码产生任何可观察的影响。

  • 在纯 Python 模式(PyPy)中,停止清除添加到 PickleCache.new_ghost 的对象的字典和槽(通常这些值是从 pickle 数据传递到 __new__)。这符合 C 代码的行为。

  • 添加对 Python 3.6 的支持。

  • state 参数不是内置字典时,修复 __setstate__ 的内部化。

4.2.2 (2016-11-29)

4.2.1 (2016-05-26)

  • 修复了 64 位 Python 3 上 Windows 的 C TimeStamp 对象的散列码。

4.2.0 (2016-05-05)

  • 修复了 Python(/PYPY) 实现 TimeStamp.timeTime 方法,使其具有亚秒精度。

  • tox 下测试 PURE_PYTHON 环境,避免污染用户的全局轮子缓存。

  • 添加对 Python 3.5 的支持。

  • 停止支持 Python 2.6 和 3.2。

4.1.1 (2015-06-02)

  • 修复清单并重新上传,以修复 4.1.0 中包含的散文件。

4.1.0 (2015-05-19)

  • 使 Python 实现的 PersistentPickleCache 的行为更类似于 C 实现。特别是,Python 版本现在可以运行完整的 ZODB 和 ZEO 测试套件。

  • 修复了 32 位平台上的 Python TimeStamp 的散列码。

4.0.9 (2015-04-08)

  • 使 C 和 Python 的 TimeStamp 对象的行为更加相似。Python 版本现在产生与 C 版本相同的 repr.raw() 输出,并且具有相同的散列码。此外,Python 版本现在支持排序和相等,就像 C 版本一样。

  • __setstate__ 中内部化对象状态键,以减少反序列化具有相同属性的多个对象时的内存使用。

  • 添加对 PyPy3 的支持。

  • 100% 分支覆盖率。

4.0.8 (2014-03-20)

  • 添加对 Python 3.4 的支持。

  • 在纯 Python Persistent 中,避免在非幽灵对象上加载状态 _p_activate(这可能破坏其状态)。(PR #9)

  • 在纯 Python 中,如果 _p_activate 被调用的对象从未提交过,则不要抛出 POSKeyError。(PR #9)

  • 在纯 Python Persistent 中,避免在实例创建时调用子类的 __setattr__。(PR #8)

  • 使纯 Python Persistent 对象的 _p_jar / _p_oid 可删除,这些对象已从 jar 的缓存中删除(修复了添加对象后中止 ZODB 连接的问题)。(PR #7)

4.0.7 (2014-02-20)

  • 避免在纯Python环境下新创建的对象在调用 _p_accessed() 时产生 KeyError 错误:这些对象可能已被分配到 jar,但尚未添加到其缓存中。(PR #6)

  • 避免当状态字典恰好包含两个键时,在 Persistent.__setstate__ 中发生失败。(PR #5)

  • 修复在 OIDs 手动以错误顺序传递时,picklecache 无效化导致的挂起问题。(PR #4)

  • 添加对 PURE_PYTHON 环境变量的支持:如果设置,将不会构建、导入或测试 C 扩展。

4.0.6 (2013-01-03)

  • 更新了 Trove 分类器。

4.0.5 (2012-12-14)

  • 修复了 Py3k 下的 C 扩展(之前它们可以编译但不能导入)。

4.0.4 (2012-12-11)

  • 添加了对 Python 3.3 的支持。

  • C 扩展现在可以在 Python 3.2 下构建,通过相同的测试,与纯 Python 参考实现一致。

4.0.3 (2012-11-19)

  • 修复:在 C 实现中,整数与指针进行了比较,结果未定义,并发出编译器警告。

  • 修复:Python 实现的 _p_estimated_size 属性不支持删除。

  • 简化了 _p_estimated_size 属性的实现,只接受整数。如果提供不正确的类型,将引发 TypeError。

4.0.2 (2012-08-27)

  • 正确初始化重命名后的 _timestamp 扩展中的初始化函数。

4.0.1 (2012-08-26)

  • 解决了由于在 32 位系统上长整数溢出导致的测试失败问题。

  • TimeStamp 扩展模块重命名为避免与纯 Python 的 timestamp 模块在大小写不敏感的文件系统中冲突。

    注意:现在导入 TimeStamp 类的规范方法是

    from persistent.timestamp import TimeStamp

    这将返回扩展模块中的类(如果可用),如果不可用则回退到纯 Python 参考实现。

4.0.0 (2012-08-11)

平台变更

  • 添加了对 Python 3.2 和 PyPy 的显式支持。

    • 请注意,在这些平台上尚未构建 Persistent、PickleCache 和 Timestamp 的 C 实现。

  • 删除了对 Python < 2.6 的支持。

测试变更

  • 100% 单元测试覆盖率。

  • 删除了所有依赖于 ZODB 的测试

    • 重写了一些以避免依赖

    • 将剩余的部分克隆到新的 ZODB.tests 模块中。

  • 重构了一些 doctests,将其重构为 unittests。

  • 完成了“Persistent”、“PickleCache”和“TimeStamp”的纯 Python 参考实现。

  • 在所有受支持的平台上通过 tox 进行了测试。

  • 添加了对使用 toxjenkins 的持续集成的支持。

  • 添加了 setup.py dev 别名(安装 nose 和 coverage)。

  • 删除了对 zope.testing / zope.testrunner 的依赖:现在测试使用 setup.py test 运行。

文档变更

  • 将许多 Doctests 重构为 Sphinx 文档(片段通过 'tox' 执行)。

  • 添加了 setup.py docs 别名(安装 Sphinx 和 repoze.sphinx.autointerface)。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分发

persistent-6.1.tar.gz (128.7 kB 查看哈希值)

上传时间

构建分发

persistent-6.1-cp313-cp313-win_amd64.whl (128.3 kB 查看哈希值)

上传时间 CPython 3.13 Windows x86-64

persistent-6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (240.7 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (239.0 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (229.2 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp313-cp313-macosx_11_0_arm64.whl (147.1 kB 查看哈希值)

上传时间 CPython 3.13 macOS 11.0+ ARM64

persistent-6.1-cp313-cp313-macosx_10_9_x86_64.whl (145.1 kB 查看哈希值)

上传时间 CPython 3.13 macOS 10.9+ x86-64

persistent-6.1-cp312-cp312-win_amd64.whl (128.3 kB 查看哈希值)

上传于 CPython 3.12 Windows x86-64

persistent-6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (241.0 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (239.3 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (229.5 kB 查看哈希值)

上传于 CPython 3.12 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp312-cp312-macosx_11_0_arm64.whl (147.1 kB 查看哈希值)

上传于 CPython 3.12 macOS 11.0+ ARM64

persistent-6.1-cp312-cp312-macosx_10_9_x86_64.whl (145.2 kB 查看哈希值)

上传于 CPython 3.12 macOS 10.9+ x86-64

persistent-6.1-cp311-cp311-win_amd64.whl (128.0 kB 查看哈希值)

上传于 CPython 3.11 Windows x86-64

persistent-6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (235.2 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (232.8 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (225.7 kB 查看哈希值)

上传于 CPython 3.11 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp311-cp311-macosx_11_0_arm64.whl (147.0 kB 查看哈希值)

上传于 CPython 3.11 macOS 11.0+ ARM64

persistent-6.1-cp311-cp311-macosx_10_9_x86_64.whl (144.6 kB 查看哈希值)

上传于 CPython 3.11 macOS 10.9+ x86-64

persistent-6.1-cp310-cp310-win_amd64.whl (128.0 kB 查看哈希值)

上传于 CPython 3.10 Windows x86-64

persistent-6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (232.3 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (229.8 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (222.8 kB 查看哈希值)

上传于 CPython 3.10 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp310-cp310-macosx_11_0_arm64.whl (147.0 kB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ ARM64

persistent-6.1-cp310-cp310-macosx_10_9_x86_64.whl (144.6 kB 查看哈希值)

上传于 CPython 3.10 macOS 10.9+ x86-64

persistent-6.1-cp39-cp39-win_amd64.whl (128.0 kB 查看哈希值)

上传于 CPython 3.9 Windows x86-64

persistent-6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (231.4 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (229.0 kB 查看哈希)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (222.0 kB 查看哈希)

上传于 CPython 3.9 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp39-cp39-macosx_11_0_arm64.whl (147.0 kB 查看哈希)

上传于 CPython 3.9 macOS 11.0+ ARM64

persistent-6.1-cp39-cp39-macosx_10_9_x86_64.whl (144.6 kB 查看哈希)

上传于 CPython 3.9 macOS 10.9+ x86-64

persistent-6.1-cp38-cp38-win_amd64.whl (128.0 kB 查看哈希)

上传于 CPython 3.8 Windows x86-64

persistent-6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (233.9 kB 查看哈希)

上传于 CPython 3.8 manylinux: glibc 2.17+ ARM64

persistent-6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (231.6 kB 查看哈希)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64 manylinux: glibc 2.5+ x86-64

persistent-6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl (224.6 kB 查看哈希)

上传于 CPython 3.8 manylinux: glibc 2.17+ i686 manylinux: glibc 2.5+ i686

persistent-6.1-cp38-cp38-macosx_11_0_arm64.whl (147.0 kB 查看哈希)

上传于 CPython 3.8 macOS 11.0+ ARM64

persistent-6.1-cp38-cp38-macosx_10_9_x86_64.whl (144.6 kB 查看哈希)

上传于 CPython 3.8 macOS 10.9+ x86-64

由以下支持