Skip to content

ids=func where func doesn't return strings results in internal error #4739

@asottile

Description

@asottile
import pytest


def id_gen(dct):
    return dct['k']


@pytest.mark.parametrize(
    'f',
    ({'k': {'val': 'val'}}, {'k': {'val2', 'val2'}}),
    ids=id_gen,
)
def test(f):
    assert f
$ pytest t.py 
============================= test session starts ==============================
platform linux -- Python 3.6.7, pytest-4.2.0, py-1.7.0, pluggy-0.8.1
rootdir: /tmp/x, inifile:
collected 0 items / 1 errors                                                   

==================================== ERRORS ====================================
____________________________ ERROR collecting t.py _____________________________
venv/lib/python3.6/site-packages/pluggy/hooks.py:284: in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
venv/lib/python3.6/site-packages/pluggy/manager.py:68: in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
venv/lib/python3.6/site-packages/pluggy/manager.py:62: in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
venv/lib/python3.6/site-packages/_pytest/python.py:226: in pytest_pycollect_makeitem
    res = list(collector._genfunctions(name, obj))
venv/lib/python3.6/site-packages/_pytest/python.py:403: in _genfunctions
    self.ihook.pytest_generate_tests(metafunc=metafunc)
venv/lib/python3.6/site-packages/pluggy/hooks.py:284: in __call__
    return self._hookexec(self, self.get_hookimpls(), kwargs)
venv/lib/python3.6/site-packages/pluggy/manager.py:68: in _hookexec
    return self._inner_hookexec(hook, methods, kwargs)
venv/lib/python3.6/site-packages/pluggy/manager.py:62: in <lambda>
    firstresult=hook.spec.opts.get("firstresult") if hook.spec else False,
venv/lib/python3.6/site-packages/_pytest/python.py:133: in pytest_generate_tests
    metafunc.parametrize(*marker.args, **marker.kwargs)
venv/lib/python3.6/site-packages/_pytest/python.py:996: in parametrize
    ids = self._resolve_arg_ids(argnames, ids, parameters, item=self.definition)
venv/lib/python3.6/site-packages/_pytest/python.py:1050: in _resolve_arg_ids
    ids = idmaker(argnames, parameters, idfn, ids, self.config, item=item)
venv/lib/python3.6/site-packages/_pytest/python.py:1196: in idmaker
    for valindex, parameterset in enumerate(parametersets)
venv/lib/python3.6/site-packages/_pytest/python.py:1196: in <listcomp>
    for valindex, parameterset in enumerate(parametersets)
venv/lib/python3.6/site-packages/_pytest/python.py:1186: in _idvalset
    for val, argname in zip(parameterset.values, argnames)
venv/lib/python3.6/site-packages/_pytest/python.py:1186: in <listcomp>
    for val, argname in zip(parameterset.values, argnames)
venv/lib/python3.6/site-packages/_pytest/python.py:1158: in _idval
    return ascii_escaped(s)
venv/lib/python3.6/site-packages/_pytest/compat.py:239: in ascii_escaped
    ret = val.encode("unicode_escape").decode("ascii")
E   AttributeError: 'dict' object has no attribute 'encode'
!!!!!!!!!!!!!!!!!!! Interrupted: 1 errors during collection !!!!!!!!!!!!!!!!!!!!
=========================== 1 error in 0.17 seconds ============================

This apparently used to work in 3.0.7:

$ pytest t.py  -vvv
============================= test session starts ==============================
platform linux -- Python 3.6.7, pytest-3.0.7, py-1.7.0, pluggy-0.4.0 -- /tmp/x/venv/bin/python3
cachedir: .cache
rootdir: /tmp/x, inifile:
collected 2 items 

t.py::test[f0] PASSED
t.py::test[f1] PASSED

=========================== 2 passed in 0.00 seconds ===========================

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: parametrizerelated to @pytest.mark.parametrizetype: bugproblem that needs to be addressedtype: regressionindicates a problem that was introduced in a release which was working previously

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions