#python #machine-learning #data-science #pytest #fixtures
#python #машинное обучение #наука о данных #pytest #приспособления
Вопрос:
Я использую pytest
для тестирования разделения данных на train, val, набор тестов для задачи машинного обучения. Я создаю временные файлы, используя tmpdir_factory
, но это выдало мне ошибку, что-то вроде TypeError: Expected binary or unicode string, got local('/tmp/pytest/pytest-4/test_folder0/train.tfrecord')
. Вот мой код:
Внутри conftest.py
:
DATA_FOLDER = 'test_folder'
@pytest.fixture(scope="session")
def train_dataset(tmpdir_factory):
return tmpdir_factory.mktemp(DATA_FOLDER).join('train.tfrecord')
@pytest.fixture(scope="session")
def val_dataset(tmpdir_factory):
return tmpdir_factory.mktemp(DATA_FOLDER).join('val.tfrecord')
@pytest.fixture(scope="session")
def test_dataset(tmpdir_factory):
return tmpdir_factory.mktemp(DATA_FOLDER).join('test.tfrecord')
Внутри тестового файла:
def test_split(train_dataset, val_dataset, test_dataset):
# the arguments of split_function refer to the path where the splitting results is written
split_function(train_dataset, val_dataset, test_dataset)
"""continue with assert functions"""
Кто-нибудь может помочь? Спасибо
Ответ №1:
Методы tmpdir_factory
fixture возвращают объект py.path.local, который инкапсулирует путь (немного похожий на pathlib.Path
). Поэтому эти вызовы методов могут быть связаны для управления путями, как это делается в ваших устройствах с использованием mktemp().join()
. Чтобы получить обратный str
путь из результата, вы должны явно преобразовать py.path.local
в str
:
@pytest.fixture(scope="session")
def train_dataset(tmpdir_factory):
return str(tmpdir_factory.mktemp(DATA_FOLDER).join('train.tfrecord'))
Поскольку ваши тестируемые функции не знают py.path.local
, преобразование путей, созданных tmpdir_factory
back to str
, обычно является способом использования этого приспособления.