infinite recursion when patching class that implements __nonzero__

Bug #732154 reported by Eduardo Habkost
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Mocker
New
Undecided
Unassigned

Bug Description

Version: mocker-1.1

Reproducer:

--------------------
import mocker

class O(object):
    def __init__(self, o):
        self._o = o

    def __nonzero__(self):
        return bool(self._o)

    @staticmethod
    def foo():
        return 'x'

m = mocker.Mocker()
mO = m.patch(O)

mO.foo()
m.result('bar')

m.replay()

x = O(1)
assert x.foo() == 'bar'
----------------

Result:

Traceback (most recent call last):
  File "break_mocker.py", line 23, in <module>
    assert x.foo() == 'bar'
  File "/usr/lib/python2.7/site-packages/mocker.py", line 2238, in __get__
    object = obj or cls
  File "break_mocker.py", line 8, in __nonzero__
    return bool(self._o)
  File "/usr/lib/python2.7/site-packages/mocker.py", line 2238, in __get__
    object = obj or cls
  File "break_mocker.py", line 8, in __nonzero__
    return bool(self._o)
  File "/usr/lib/python2.7/site-packages/mocker.py", line 2238, in __get__
    object = obj or cls
  File "break_mocker.py", line 8, in __nonzero__
    return bool(self._o)
  File "/usr/lib/python2.7/site-packages/mocker.py", line 2238, in __get__
    object = obj or cls
[...]
  File "break_mocker.py", line 8, in __nonzero__
    return bool(self._o)
  File "/usr/lib/python2.7/site-packages/mocker.py", line 2238, in __get__
    object = obj or cls
RuntimeError: maximum recursion depth exceeded

If the __nonzero__ method is removed from class 'O', the code works as expected.

Revision history for this message
t0ster (tosters) wrote :

Same with `__len__()` method

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.