Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is the shortcircuit behaviour of Python's any/all explicit?

Prompted by the discussion here

The docs suggest some equivalent code for the behaviour of all and any

Should the behaviour of the equivalent code be considered part of the definition, or can an implementation implement them in a non-shortcircuit manner?

Here is the relevant excerpt from cpython/Lib/test/test_builtin.py

def test_all(self):     self.assertEqual(all([2, 4, 6]), True)     self.assertEqual(all([2, None, 6]), False)     self.assertRaises(RuntimeError, all, [2, TestFailingBool(), 6])     self.assertRaises(RuntimeError, all, TestFailingIter())     self.assertRaises(TypeError, all, 10)               # Non-iterable     self.assertRaises(TypeError, all)                   # No args     self.assertRaises(TypeError, all, [2, 4, 6], [])    # Too many args     self.assertEqual(all([]), True)                     # Empty iterator     S = [50, 60]     self.assertEqual(all(x > 42 for x in S), True)     S = [50, 40, 60]     self.assertEqual(all(x > 42 for x in S), False)  def test_any(self):     self.assertEqual(any([None, None, None]), False)     self.assertEqual(any([None, 4, None]), True)     self.assertRaises(RuntimeError, any, [None, TestFailingBool(), 6])     self.assertRaises(RuntimeError, all, TestFailingIter())     self.assertRaises(TypeError, any, 10)               # Non-iterable     self.assertRaises(TypeError, any)                   # No args     self.assertRaises(TypeError, any, [2, 4, 6], [])    # Too many args     self.assertEqual(any([]), False)                    # Empty iterator     S = [40, 60, 30]     self.assertEqual(any(x > 42 for x in S), True)     S = [10, 20, 30]     self.assertEqual(any(x > 42 for x in S), False) 

It doesn't do anything to enforce the shortcircuit behaviour

like image 710
John La Rooy Avatar asked Feb 06 '13 13:02

John La Rooy


People also ask

Does Python all short circuit?

Short-Circuiting in all() and any() Inbuilt functions all() and any() in python also support short-circuiting.

Does Python short circuit conditionals?

Python checks the expression based on the short circuit evaluation. In the table itself, we have learned that “evaluates the second argument that is y, if the first argument x is False”. That is, it takes the first argument if it is True. It will return the first argument as it is.

Does Python support short-circuiting in Boolean expression?

Python's any() and all() functions also support short-circuiting.


1 Answers

The behaviour is guaranteed. I've contributed a patch, which was accepted and merged recently, so if you grab the latest sources you will see that the short-circuiting behaviour is now explicitly enforced.

git clone https://github.com/python/cpython.git grep Short-circuit cpython/Lib/test/test_builtin.py 
like image 85
wim Avatar answered Sep 22 '22 18:09

wim