Angeregt durch die Diskussion hereIst das Shortcircuit-Verhalten von Pythons Any/All explizit?
Die docs vorschlagen einigen entsprechenden Code für das Verhalten von all
und any
Sollte das Verhalten des äquivalenten Code Teil der Definition in Betracht gezogen werden, oder kann sie eine Implementierung umzusetzen in einem Nicht-Kurzschluss-Art?
Hier ist der relevante Auszug aus 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)
Es hat nichts tun das Kurzschlussverhalten
Interessant, dass die Testsuite keinen Kurzschluss erzwingt. Scheint mir ein Versehen. Ich behaupte immer noch, dass Kurzschlüsse Teil der Spezifikation sind. – mgilson
Ich habe einen Fehler im Code entdeckt, den Sie gepostet und [ein Problem] abgelegt haben (http://bugs.python.org/issue17142). – Sjoerd
Ich habe auch [eine Ausgabe] (http://bugs.python.org/issue17255) für das betreffende Verhalten eingereicht. – wim