Pytest:如何找到 FutureWarning 并修复它?
Pytest: How to locate a FutureWarning and fix it?
在我当前的项目中,当我 运行 我的测试(使用 pytest
)时,我得到了这个输出(除了其他):
ml_framework/tests/test_impute.py: 8 warnings
ml_framework/tests/test_transform_pipeline.py: 9 warnings
ml_framework/tests/test_data_transforms.py: 27 warnings
ml_framework/tests/test_jsonizer.py: 4 warnings
/home/sondracek/anaconda3/envs/p3.8/lib/python3.8/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
warnings.warn(f"Pass {args_msg} as keyword args. From version "
这个FutureWarning
很清楚-从1.0版本开始(我现在用的是0.24
)会有一些参数改变,我将无法通过standardize
作为位置参数。
但问题是 - 我如何找到我应该在哪里将这个位置参数更改为关键字 one?
我可以转到警告输出中提到的 validation.py
,但是有一个通用的 _deprecate_positional_args
函数不会告诉我哪个代码调用它。
在这种特殊情况下,我猜测这将来自从 sklearn.preprocessing
导入的 PowerTransformer
,它在我的代码中使用,具有 standardize
参数并在列出的测试中进行了测试. 是否有一种通用的方法可以轻松找到任何 FutureWarning
的原因? 或者我是否需要检查我的所有代码并尝试以某种方式找到它?
Pytest 让你抛出一个 FutureWarning
作为错误,这样它指向抛出警告的代码位置,最简单的方法是通过警告标志
pytest -W error::FutureWarning test_script.py
或在 test_script.py
内到 pytestmark
pytestmark = pytest.mark.filterwarnings("error::FutureWarning")
您可以阅读有关指定针对警告采取的操作的更多信息 here and here。
例子
考虑以下虚拟示例test_transform.py
脚本
# test_transform.py
import pytest
pytestmark = pytest.mark.filterwarnings("error::FutureWarning")
def test_transformer_boxcox():
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer('box-cox', False)
assert True
def test_transformer_yeo_johnson():
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer('yeo-johnson', False)
assert True
和 运行 在终端
pytest test_transform.py > logs.log
日志准确地告诉我 PowerTransformer
引发了 FutureWarning
。
===================================================== test session starts =====================================================
platform linux -- Python 3.7.6, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: /home/jovyan/work
collected 2 items
test_transform.py FF [100%]
========================================================== FAILURES ===========================================================
___________________________________________________ test_transformer_boxcox ___________________________________________________
def test_transformer_boxcox():
from sklearn.preprocessing import PowerTransformer
> pt = PowerTransformer('box-cox', False)
test_transform.py:11:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
args = (<[AttributeError("'PowerTransformer' object has no attribute 'copy'") raised in repr()] PowerTransformer object at 0x7fa0bda14d50>, 'box-cox', False)
kwargs = {}, extra_args = 1, args_msg = 'standardize=False'
@wraps(f)
def inner_f(*args, **kwargs):
extra_args = len(args) - len(all_args)
if extra_args <= 0:
return f(*args, **kwargs)
# extra_args > 0
args_msg = ['{}={}'.format(name, arg)
for name, arg in zip(kwonly_args[:extra_args],
args[-extra_args:])]
args_msg = ", ".join(args_msg)
warnings.warn(f"Pass {args_msg} as keyword args. From version "
f"{version} passing these as positional arguments "
> "will result in an error", FutureWarning)
E FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py:72: FutureWarning
________________________________________________ test_transformer_yeo_johnson _________________________________________________
def test_transformer_yeo_johnson():
from sklearn.preprocessing import PowerTransformer
> pt = PowerTransformer('yeo-johnson', False)
test_transform.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
args = (<[AttributeError("'PowerTransformer' object has no attribute 'copy'") raised in repr()] PowerTransformer object at 0x7fa0bd02f750>, 'yeo-johnson', False)
kwargs = {}, extra_args = 1, args_msg = 'standardize=False'
@wraps(f)
def inner_f(*args, **kwargs):
extra_args = len(args) - len(all_args)
if extra_args <= 0:
return f(*args, **kwargs)
# extra_args > 0
args_msg = ['{}={}'.format(name, arg)
for name, arg in zip(kwonly_args[:extra_args],
args[-extra_args:])]
args_msg = ", ".join(args_msg)
warnings.warn(f"Pass {args_msg} as keyword args. From version "
f"{version} passing these as positional arguments "
> "will result in an error", FutureWarning)
E FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py:72: FutureWarning
=================================================== short test summary info ===================================================
FAILED test_transform.py::test_transformer_boxcox - FutureWarning: Pass standardize=False as keyword args. From version 1.0 ...
FAILED test_transform.py::test_transformer_yeo_johnson - FutureWarning: Pass standardize=False as keyword args. From version...
====================================================== 2 failed in 0.71s ======================================================
在我当前的项目中,当我 运行 我的测试(使用 pytest
)时,我得到了这个输出(除了其他):
ml_framework/tests/test_impute.py: 8 warnings
ml_framework/tests/test_transform_pipeline.py: 9 warnings
ml_framework/tests/test_data_transforms.py: 27 warnings
ml_framework/tests/test_jsonizer.py: 4 warnings
/home/sondracek/anaconda3/envs/p3.8/lib/python3.8/site-packages/sklearn/utils/validation.py:70: FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
warnings.warn(f"Pass {args_msg} as keyword args. From version "
这个FutureWarning
很清楚-从1.0版本开始(我现在用的是0.24
)会有一些参数改变,我将无法通过standardize
作为位置参数。
但问题是 - 我如何找到我应该在哪里将这个位置参数更改为关键字 one?
我可以转到警告输出中提到的 validation.py
,但是有一个通用的 _deprecate_positional_args
函数不会告诉我哪个代码调用它。
在这种特殊情况下,我猜测这将来自从 sklearn.preprocessing
导入的 PowerTransformer
,它在我的代码中使用,具有 standardize
参数并在列出的测试中进行了测试. 是否有一种通用的方法可以轻松找到任何 FutureWarning
的原因? 或者我是否需要检查我的所有代码并尝试以某种方式找到它?
Pytest 让你抛出一个 FutureWarning
作为错误,这样它指向抛出警告的代码位置,最简单的方法是通过警告标志
pytest -W error::FutureWarning test_script.py
或在 test_script.py
内到 pytestmark
pytestmark = pytest.mark.filterwarnings("error::FutureWarning")
您可以阅读有关指定针对警告采取的操作的更多信息 here and here。
例子
考虑以下虚拟示例test_transform.py
脚本
# test_transform.py
import pytest
pytestmark = pytest.mark.filterwarnings("error::FutureWarning")
def test_transformer_boxcox():
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer('box-cox', False)
assert True
def test_transformer_yeo_johnson():
from sklearn.preprocessing import PowerTransformer
pt = PowerTransformer('yeo-johnson', False)
assert True
和 运行 在终端
pytest test_transform.py > logs.log
日志准确地告诉我 PowerTransformer
引发了 FutureWarning
。
===================================================== test session starts =====================================================
platform linux -- Python 3.7.6, pytest-6.2.2, py-1.10.0, pluggy-0.13.1
rootdir: /home/jovyan/work
collected 2 items
test_transform.py FF [100%]
========================================================== FAILURES ===========================================================
___________________________________________________ test_transformer_boxcox ___________________________________________________
def test_transformer_boxcox():
from sklearn.preprocessing import PowerTransformer
> pt = PowerTransformer('box-cox', False)
test_transform.py:11:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
args = (<[AttributeError("'PowerTransformer' object has no attribute 'copy'") raised in repr()] PowerTransformer object at 0x7fa0bda14d50>, 'box-cox', False)
kwargs = {}, extra_args = 1, args_msg = 'standardize=False'
@wraps(f)
def inner_f(*args, **kwargs):
extra_args = len(args) - len(all_args)
if extra_args <= 0:
return f(*args, **kwargs)
# extra_args > 0
args_msg = ['{}={}'.format(name, arg)
for name, arg in zip(kwonly_args[:extra_args],
args[-extra_args:])]
args_msg = ", ".join(args_msg)
warnings.warn(f"Pass {args_msg} as keyword args. From version "
f"{version} passing these as positional arguments "
> "will result in an error", FutureWarning)
E FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py:72: FutureWarning
________________________________________________ test_transformer_yeo_johnson _________________________________________________
def test_transformer_yeo_johnson():
from sklearn.preprocessing import PowerTransformer
> pt = PowerTransformer('yeo-johnson', False)
test_transform.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
args = (<[AttributeError("'PowerTransformer' object has no attribute 'copy'") raised in repr()] PowerTransformer object at 0x7fa0bd02f750>, 'yeo-johnson', False)
kwargs = {}, extra_args = 1, args_msg = 'standardize=False'
@wraps(f)
def inner_f(*args, **kwargs):
extra_args = len(args) - len(all_args)
if extra_args <= 0:
return f(*args, **kwargs)
# extra_args > 0
args_msg = ['{}={}'.format(name, arg)
for name, arg in zip(kwonly_args[:extra_args],
args[-extra_args:])]
args_msg = ", ".join(args_msg)
warnings.warn(f"Pass {args_msg} as keyword args. From version "
f"{version} passing these as positional arguments "
> "will result in an error", FutureWarning)
E FutureWarning: Pass standardize=False as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
/opt/conda/lib/python3.7/site-packages/sklearn/utils/validation.py:72: FutureWarning
=================================================== short test summary info ===================================================
FAILED test_transform.py::test_transformer_boxcox - FutureWarning: Pass standardize=False as keyword args. From version 1.0 ...
FAILED test_transform.py::test_transformer_yeo_johnson - FutureWarning: Pass standardize=False as keyword args. From version...
====================================================== 2 failed in 0.71s ======================================================