Допустим, мне нужно импортировать пакеты, которые нельзя импортировать до тех пор, пока не будет запущен какой-либо код установки (приведено ниже).
Есть ли способ поместить этот импорт в осветитель?
Пример
Вот что я чувствую, должно работать:
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!!")
... что имеет смысл, но этот подход все еще кажется неуклюжим.