2. Never return anything in a function, especially not some type of value that could demonstrate your function succeeded or failed.
First, why would you do his in a language where the idiomatic way to express that a function has failed is to throw an exception? Second, this is a pretty extreme failure and probably rare in (useful) Python code; why complain about about this when there is a real, extremely common problem in Python programming: not documenting your exceptions, so users who want to distinguish between different failure modes are forced to experiment and/or read your code.
First, why would you do his in a language where the idiomatic way to express that a function has failed is to throw an exception? Second, this is a pretty extreme failure and probably rare in (useful) Python code; why complain about about this when there is a real, extremely common problem in Python programming: not documenting your exceptions, so users who want to distinguish between different failure modes are forced to experiment and/or read your code.