Pytest tmpdir_factory выдал ошибку «Ожидаемая двоичная или юникодная строка, получена локальная»

#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 , обычно является способом использования этого приспособления.