New submission from Shawn Krisman: import mock from collections import namedtuple
Foo = namedtuple('Foo', bar) mock_foo = mock.create_autospec(Foo) if mock_foo: print('the namedtuple is truthy') else: print('the namedtuple is not truthy') The expected behavior is that it should print "the namedtuple is truthy." Instead it prints "the namedtuple is not truthy." Almost all namedtuples are truthy, the exception being the nearly useless namedtuple with 0 fields. The problem stems from the fact that tuples have a __len__ defined which is what is used derive truthiness. MagicMocks define __len__ to be zero by default. Workarounds to the problem are very difficult because you cannot simply define __len__ to be a nonzero number and have the mock work correctly. In general MagicMock has defaults that encourage the mocks to be very truthy all around: __bool__ -- True __int__ -- 1 __complex__ -- 1j __float__ -- 1.0 __index__ -- 1 So it was interesting to me to find out that __len__ was defined to be 0. The fix that I am proposing is to make 1 the new default for __len__. I believe this is a more useful default in general because an instance of a class with a __len__ attribute will likely be truthy far more often then not. There are of course backwards compatibility issues to consider here, however I don't think many people are assuming this behavior. Certainly nobody in the python code base. ---------- components: Library (Lib) files: namedtuple_truthiness.patch keywords: patch messages: 197698 nosy: michael.foord, skrisman priority: normal severity: normal status: open title: autospecced namedtuples should be truthy by default type: behavior versions: Python 3.5 Added file: http://bugs.python.org/file31755/namedtuple_truthiness.patch _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue19016> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com