Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

Cannot pickle functions decorated through contextlib

未关闭
#509 1 条评论 2 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

评估

难度
4/5
预计耗时
3-5 天
新手友好度
35/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
停滞
技术栈
python
领域
tooling

调研方向

从 demo.py 示例中复现该故障,并检查 traceback 中显示的 dump 路径附近的 cloudpickle/cloudpickle_fast.py,同时检查 Python 的 contextmanager 和 asynccontextmanager 行为。完成的标准是,两个经过装饰的函数都可以被序列化和反序列化,不出现 generator 或 async_generator 错误,并保留其装饰器行为。

由索引模型根据 Issue 内容生成。

描述

It's a somewhat little known feature of contextlib.contextmanager and contextlib.asynccontextmanager that you can use the decorated functions not only as context managers, but also as function decorators:

import asyncio
from contextlib import contextmanager, asynccontextmanager

@contextmanager
def c():
    print("before")
    yield
    print("after")

@c()
def f():
    print("hello world")

f()

@asynccontextmanager
async def ac():
    print("async before")
    yield
    print("async after")

@ac()
async def af():
    print("async hello world")

asyncio.run(af())
before
hello world
after
async before
async hello world
async after

cloudpickle 2.2.1 fails to serialize functions decorated this way:

>>> pickle.loads(pickle.dumps(f))
<function f at 0x7f949972d580>

>>> pickle.loads(pickle.dumps(af))
<function af at 0x7f9499770180>

>>> cloudpickle.dumps(f)
Traceback (most recent call last):
  File "demo.py", line 34, in <module>
    cloudpickle.dumps(f)
          ^^^^^^^^^^^^^^^^^^^^
  File "lib/python3.11/site-packages/cloudpickle/cloudpickle_fast.py", line 73, in dumps
    cp.dump(obj)
  File "lib/python3.11/site-packages/cloudpickle/cloudpickle_fast.py", line 632, in dump
    return Pickler.dump(self, obj)
           ^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot pickle 'generator' object

>>> cloudpickle.dumps(af)
Traceback (most recent call last):
  File "demo.py", line 35, in <module>
    cloudpickle.dumps(af)
          ^^^^^^^^^^^^^^^^^^^^^
  File "lib/python3.11/site-packages/cloudpickle/cloudpickle_fast.py", line 73, in dumps
    cp.dump(obj)
  File "lib/python3.11/site-packages/cloudpickle/cloudpickle_fast.py", line 632, in dump
    return Pickler.dump(self, obj)
           ^^^^^^^^^^^^^^^^^^^^^^^
TypeError: cannot pickle 'async_generator' object
主要语言
Python
星标
1.9k
派生
197
平均合并
1 天 10 小时
30 天内合并 PR
1

环境准备

我们还没有检查这个项目的环境配置文件。先看它的 README,通用步骤见我们的新手贡献指南。

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

cloudpipe/cloudpickle 的其他 Issue

查看 cloudpipe/cloudpickle 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。