Приспособление Pytest Cache с Pickle вместо JSON - PullRequest
1 голос
/ 31 марта 2020

Я хотел бы кэшировать объект, который я создаю, на создание которого уходит много времени. Однако невозможно закодировать его как объект JSON, поэтому встроенная функция кэширования выдаст ошибку. Есть ли способ использовать рассол вместо JSON для кэширования?

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете выбрать ваши данные, преобразовать их в строку и кэшировать эту строку. Это добавляет некоторое время для кодирования / декодирования, но это не должно быть существенным.
Вот пример из документации по Pytest с добавленным травлением:

import pickle
import pytest


def expensive_computation():
    print("running expensive computation...")
    return 42


@pytest.fixture
def mydata(request):
    val = request.config.cache.get("example/value", None)
    if val is None:
        val = expensive_computation()
        res = pickle.dumps(val).decode('cp437')
        request.config.cache.set("example/value", res)
    else:
        val = pickle.loads(val.encode('cp437'))
    return val


def test_function(mydata):
    assert mydata == 42

Обратите внимание, что я использовал старый 'cp437' для кодирования / декодирования, поскольку он, кажется, покрывает произвольные байты (как и любое 8-битное кодирование), хотя я уверен, что есть лучшие методы. По сути, вам нужно преобразовать произвольные байты в строку и обратно любым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...