在scikit learn中,有一个函数parametrize_with_checks()
被用作pytest fixture工厂——它返回一个pytest.mark.parametrize
fixture,并被称为具有可迭代估计量的装饰器,例如
@parameterize_with_checks(list_of_estimators)
我的问题是,我的估计器列表可能会发生变化(或者我可能有多个列表(,并且我在固定装置中设置的每个列表。
这是一个M(N(WE:
import pytest
from sklearn.linear_model import LinearRegression
from sklearn.utils.estimator_checks import parametrize_with_checks
@pytest.fixture
def models():
return (LinearRegression(fit_intercept=flag) for flag in (False, True))
class TestModels:
@parametrize_with_checks(models)
def test_1(self, estimator, check):
check(estimator)
print("Do other stuff...")
def test_2(self, models):
print("Do even more stuff...")
然而,当models
被传递给parametrize_with_checks
时,它仍然是一个函数对象,因此它抛出了一个错误。我该怎么绕过这个?
parametrize_with_checks()
无法使用fixture设置的值。它处理models
只是一个函数,而不是一个固定装置。您只能从测试函数访问fixture
因此,看起来您需要将models
设置为列表,或者调用parametrize_with_checks()
中的模型函数
import pytest
from sklearn.linear_model import LinearRegression
from sklearn.utils.estimator_checks import parametrize_with_checks
MODELS = [LinearRegression(fit_intercept=flag) for flag in (False, True)]
@pytest.fixture()
def models():
return [LinearRegression(fit_intercept=flag) for flag in (False, True)]
class TestModels:
@parametrize_with_checks(MODELS)
# OR
# @parametrize_with_checks(estimators=models())
def test_1(self, estimator, check):
check(estimator)
print("Do other stuff...")
def test_2(self, models):
print("Do even more stuff...")