Criei um módulo "persist" contendo uma função obj_pickle que estou usando para conservar vários objetos no meu projeto. Funciona bem, mas está falhando no pytest, retornando:
> pickle.dump(obj, file_handle, protocol=protocol)
E AttributeError: Can't pickle local object 'test_object.<locals>.TestObject'
Correndo:
- python 3.12
- Versão do pytest: 8.3.5
Vejo que há problemas semelhantes relacionados ao multiprocessamento, mas não acho que o PyTest esteja expondo esse problema. Código abaixo, e muito obrigado.
# lib.persist.py
from pathlib import Path
import pickle
def obj_pickle(obj: object, dir:Path, protocol: int = pickle.HIGHEST_PROTOCOL) -> None:
"""
Pickle an object to a byte file.
"""
if not dir.exists():
dir.mkdir(parents=True, exist_ok=True)
path = Path(dir, obj.instance_name + '.pkl')
with open(path, "wb") as file_handle:
pickle.dump(obj, file_handle, protocol=protocol)
print(f"{obj.__class__.__name__} object {obj.instance_name} saved to {path}")
# tests.test_persist.py
from pathlib import Path
import pytest
from lib.persist import obj_pickle
TEST_DIR = Path("test_dir")
@pytest.fixture
def test_object():
class TestObject():
def __init__(self, instance_file_name):
self.instance_file_name = instance_file_name
self.data = "This is a test object."
test_object = TestObject("test_object_file")
return test_object
def test_obj_pickle(test_object):
obj_pickle(test_object, Path(TEST_DIR))
path = Path(TEST_DIR, "test_object_file" + ".pkl")
assert path.exists()