Использование приборов Pytest для отсрочки импорта - PullRequest
0 голосов
/ 31 августа 2018

Допустим, мне нужно импортировать пакеты, которые нельзя импортировать до тех пор, пока не будет запущен какой-либо код установки (приведено ниже).

Есть ли способ поместить этот импорт в осветитель?

Пример

Вот что я чувствую, должно работать:

import pytest


@pytest.fixture(scope='module')
def setup():
    print("Setup code")
    yield
    print("Tear down")


@pytest.fixture
def defer_imports():
    # requires some setup code to run first
    import re
    import sys
    return re, sys


def test_pattern(setup, defer_imports):
    pattern = re.compile('_.*')
    assert pattern.match("_private")
    print("pattern works!!")


def test_paths(setup, defer_imports):
    pattern = re.compile('site-packages')
    assert any(pattern.search(path) for path in sys.path)
    print("Site packages found!!")

... однако, при запуске этого, re и sys не являются распознанными идентификаторами.

Обоснование

Причина, по которой мне нужно это сделать, заключается в том, что для тестов с пакетом Autodesk maya.cmds его нельзя импортировать до тех пор, пока он не «инициализирует» сеанс maya (с помощью maya.standalone.initialize()); это не просто простая модификация sys.paths. В любом случае, смысл в том, что если я попытаюсь импортировать maya.cmds перед вызовом initialize, весь тестовый модуль не сможет загрузиться.

Я могу запустить тесты, если скопирую операторы импорта в каждый отдельный тест, но это нецелесообразно (и некрасиво) для больших наборов тестов.

Последующий

Похоже, Id 'неправильно предположил, что кортежи были распакованы из приспособлений; вместо этого к модулям можно получить доступ, распаковав объект defer_imports следующим образом:

def test_pattern(setup, defer_imports):
    re, sys = defer_imports
    pattern = re.compile('_.*')
    assert pattern.match("_private")
    print("pattern works!!") 

... что имеет смысл, но этот подход все еще кажется неуклюжим.

...