Pytest: INTERNALERROR> IndexError: list index out of range (Python 3.4)

Created on 24 May 2015  路  11Comments  路  Source: pytest-dev/pytest

Originally reported by: Andrew Gorcester (BitBucket: andrewsg, GitHub: andrewsg)


After changing a line of source inside a dict literal in my project from this:

#!python

    0x0b: (self.ANC, "IMM"),

to this:

#!python

    0x0b: None, #(self.ANC, "IMM"),

py.test started throwing the following error:

#!

platform linux -- Python 3.4.0 -- py-1.4.27 -- pytest-2.7.1
rootdir: /home/andrewsg/src/python-c64, inifile: 
collected 108 items 

test_c64.py .......
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/main.py", line 84, in wrap_session
INTERNALERROR>     doit(config, session)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/main.py", line 122, in _main
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/main.py", line 142, in pytest_runtestloop
INTERNALERROR>     item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 393, in execute
INTERNALERROR>     return wrapped_call(method(*args), self.execute)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 113, in wrapped_call
INTERNALERROR>     return call_outcome.get_result()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 137, in get_result
INTERNALERROR>     raise ex[1].with_traceback(ex[2])
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 123, in __init__
INTERNALERROR>     self.result = func()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/runner.py", line 65, in pytest_runtest_protocol
INTERNALERROR>     runtestprotocol(item, nextitem=nextitem)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/runner.py", line 75, in runtestprotocol
INTERNALERROR>     reports.append(call_and_report(item, "call", log))
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/runner.py", line 121, in call_and_report
INTERNALERROR>     report = hook.pytest_runtest_makereport(item=item, call=call)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 393, in execute
INTERNALERROR>     return wrapped_call(method(*args), self.execute)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 109, in wrapped_call
INTERNALERROR>     wrap_controller.send(call_outcome)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/skipping.py", line 157, in pytest_runtest_makereport
INTERNALERROR>     rep = outcome.get_result()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 137, in get_result
INTERNALERROR>     raise ex[1].with_traceback(ex[2])
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 123, in __init__
INTERNALERROR>     self.result = func()
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/runner.py", line 224, in pytest_runtest_makereport
INTERNALERROR>     longrepr = item.repr_failure(excinfo)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/python.py", line 625, in repr_failure
INTERNALERROR>     return self._repr_failure_py(excinfo, style=style)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/python.py", line 618, in _repr_failure_py
INTERNALERROR>     style=style)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/_pytest/main.py", line 410, in _repr_failure_py
INTERNALERROR>     style=style, tbfilter=tbfilter)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/py/_code/code.py", line 412, in getrepr
INTERNALERROR>     return fmt.repr_excinfo(self)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/py/_code/code.py", line 590, in repr_excinfo
INTERNALERROR>     reprtraceback = self.repr_traceback(excinfo)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/py/_code/code.py", line 582, in repr_traceback
INTERNALERROR>     reprentry = self.repr_traceback_entry(entry, einfo)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/py/_code/code.py", line 543, in repr_traceback_entry
INTERNALERROR>     s = self.get_source(source, line_index, excinfo, short=short)
INTERNALERROR>   File "/home/andrewsg/src/py34env/lib/python3.4/site-packages/py/_code/code.py", line 484, in get_source
INTERNALERROR>     lines.append(self.flow_marker + "   " + source.lines[line_index])
INTERNALERROR> IndexError: list index out of range

=========================== 7 passed in 0.06 seconds ===========================

I saw #560 with the same error message, but it looks like this is a different issue; at the least, my version is much newer than the patch date for that issue's resolution.


bug

Most helpful comment

A bit delayed, but I just came across my workaround for this, in ruamel.yaml.
I removed the workarounds and can confirm this is solved.
Thank you!

All 11 comments

_Original comment by_ Andrew Gorcester (BitBucket: andrewsg, GitHub: andrewsg):


The project is available online, pinned to the offending commit: https://github.com/andrewsg/python-c64/tree/ed738342c1e3f30b19db5b1c878c8c4547435c0d

The problematic line is c64.py line 172. Lines prior to that, even though they may follow the exact same pattern, do not cause an error.

_Original comment by_ Anthon van der Neut (BitBucket: anthon_van_der_neut, GitHub: anthon_van_der_neut):


I can confirm this error with this minimal fail.py file:

def round_trip(dinp):
     assert 1 == dinp


def test_rt():
     round_trip("""
""")

Fails on 2.7.10, 2.6, 3.3 and 3.4. Inserting 4 spaces before the closing """ removes the error in this case ( I found this with a more complex example, where changing the string that way does not help but this example is the result of minimizing the fail case).

_Original comment by_ Daniel Hahler (BitBucket: blueyed, GitHub: blueyed):


Here is another case:

The code, where the commented "password" line seems to cause the offset error:

@pytest.fixture
def staff_user(db):
    "A fixture to provide a staff user."
    from django_factory_boy import auth as auth_factories
    user = auth_factories.UserFactory(
        username='staff-test-user',
        # password="123456",
        is_staff=True)
    # group = Group.objects.get('Staff')
    # user.groups.add(group)
    return user


ipdb> p source.lines
['@pytest.fixture', 'def staff_user(db):', '    "A fixture to provide a staff user."', '    from django_factory_boy import auth as auth_factories', '    user = auth_factories.UserFactory(', "        username='staff-test-user',"]

ipdb> p line_index
7

ipdb> p len(source.lines)
6

_Original comment by_ Daniel Hahler (BitBucket: blueyed, GitHub: blueyed):


There are several duplicates / similar issues about this: https://bitbucket.org/pytest-dev/pytest/issues?status=new&status=open&q=list%20index%20out%20of%20range

_Original comment by_ Daniel Hahler (BitBucket: blueyed, GitHub: blueyed):


Bisecting pylib shows up this as first bad commit:

The first bad revision is:
changeset:   2268:d7d5337ac74a
branch:      astcomments
user:        Thomas Tanner <X>
date:        Sat Dec 27 01:47:36 2014 +0100
summary:     source:getstatementrange_ast: search the code block end from the beginning, not from the end

https://bitbucket.org/pytest-dev/py/commits/d7d5337ac74a054ad13bc7e28f976d00f051ace3

_Original comment by_ Daniel Hahler (BitBucket: blueyed, GitHub: blueyed):


The issue in pylib is the following: https://bitbucket.org/pytest-dev/py/issue/55/broken-comment-parsing

Is there already a solution for this issue?

I'm getting a similar error message. Here's how I can reproduce it:

$ cat test_pytest.py
def test_pytest():
    foo = {
        #
        'bar': 1 / 0
    }
$ py.test test_pytest.py

========================================================================== test session starts ===========================================================================
platform darwin -- Python 2.7.8 -- py-1.4.27 -- pytest-2.7.0
rootdir: /Users/vladimir/Developer, inifile:
collected 1 items

test_pytest.py
INTERNALERROR> Traceback (most recent call last):
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/main.py", line 84, in wrap_session
INTERNALERROR>     doit(config, session)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/main.py", line 122, in _main
INTERNALERROR>     config.hook.pytest_runtestloop(session=session)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/main.py", line 142, in pytest_runtestloop
INTERNALERROR>     item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 393, in execute
INTERNALERROR>     return wrapped_call(method(*args), self.execute)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 113, in wrapped_call
INTERNALERROR>     return call_outcome.get_result()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 138, in get_result
INTERNALERROR>     py.builtin._reraise(*ex)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 123, in __init__
INTERNALERROR>     self.result = func()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/runner.py", line 65, in pytest_runtest_protocol
INTERNALERROR>     runtestprotocol(item, nextitem=nextitem)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/runner.py", line 75, in runtestprotocol
INTERNALERROR>     reports.append(call_and_report(item, "call", log))
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/runner.py", line 121, in call_and_report
INTERNALERROR>     report = hook.pytest_runtest_makereport(item=item, call=call)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 521, in __call__
INTERNALERROR>     return self._docall(self.methods, kwargs)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 528, in _docall
INTERNALERROR>     firstresult=self.firstresult).execute()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 393, in execute
INTERNALERROR>     return wrapped_call(method(*args), self.execute)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 109, in wrapped_call
INTERNALERROR>     wrap_controller.send(call_outcome)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/skipping.py", line 157, in pytest_runtest_makereport
INTERNALERROR>     rep = outcome.get_result()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 138, in get_result
INTERNALERROR>     py.builtin._reraise(*ex)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 123, in __init__
INTERNALERROR>     self.result = func()
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/core.py", line 394, in execute
INTERNALERROR>     res = method(*args)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/runner.py", line 224, in pytest_runtest_makereport
INTERNALERROR>     longrepr = item.repr_failure(excinfo)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/python.py", line 625, in repr_failure
INTERNALERROR>     return self._repr_failure_py(excinfo, style=style)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/python.py", line 618, in _repr_failure_py
INTERNALERROR>     style=style)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/_pytest/main.py", line 410, in _repr_failure_py
INTERNALERROR>     style=style, tbfilter=tbfilter)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/py/_code/code.py", line 412, in getrepr
INTERNALERROR>     return fmt.repr_excinfo(self)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/py/_code/code.py", line 590, in repr_excinfo
INTERNALERROR>     reprtraceback = self.repr_traceback(excinfo)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/py/_code/code.py", line 582, in repr_traceback
INTERNALERROR>     reprentry = self.repr_traceback_entry(entry, einfo)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/py/_code/code.py", line 543, in repr_traceback_entry
INTERNALERROR>     s = self.get_source(source, line_index, excinfo, short=short)
INTERNALERROR>   File "/usr/local/lib/python2.7/site-packages/py/_code/code.py", line 484, in get_source
INTERNALERROR>     lines.append(self.flow_marker + "   " + source.lines[line_index])
INTERNALERROR> IndexError: list index out of range

============================================================================  in 0.01 seconds ============================================================================

An even smaller example that reproduces it:

$ cat test_pytest.py
(
    #
    1 / 0
)

Removing the comment fixes it.

The issue in pylib (https://bitbucket.org/pytest-dev/py/issue/55/broken-comment-parsing) is fixed and has been released in py 1.4.29.

Closing this issue for pytest therefore.

A bit delayed, but I just came across my workaround for this, in ruamel.yaml.
I removed the workarounds and can confirm this is solved.
Thank you!

Was this page helpful?
0 / 5 - 0 ratings