Hacktoberfest 2026:メンテナが10月に向けて印を付けた、オープンで初心者向けの issue。 Hacktoberfest の issue を見る

Cannot pickle functions decorated through contextlib

オープン
#509 コメント 1 件 リアクション 2 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

評価

難易度
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時間
マージ済み PR(30日)
1

環境構築

このプロジェクトの環境構築ファイルはまだ確認していません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

cloudpipe/cloudpickle のほかの issue

cloudpipe/cloudpickle の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。