Okay I may just be having a bad workday but to my knowledge all() should short circuit according to the docs.
all() should be equivalent to:
def all(iterable):
for element in iterable:
if not element:
return False
return True
Which is also equivalent to daisy chaining and.
So the following should do the same thing:
all((True, print('This should print and stop'), print("this shouldn't print")))
True and print('This should print and stop') and print("this shouldn't print")
Yet the top one does both prints (i.e. fully evaluated each part) but the bottom short circuited properly.
Is this a bug with Python (3.8.2) or am I not getting this right all of a sudden?
Repl with example: https://repl.it/join/scxbpnhc-syntactical01