I write a lot of Python. I hate it when people use "X is more pythonic" as some kind of argument for what is a better solution to a problem. I also have a hang up with people acting like python has any form of type safety, instead of just embracing duck typing.This lands us at the following:
The article states that "you can check a list for emptiness in two ways: if not mylist or if len(mylist) == 0". Already here, a fundamental mistake has been made: You don't know (and shouldn't care) whether mylist is a list. These two checks are not different ways of doing the same thing, but two different checks altogether. The first checks whether the object is "falsey" and the second checks whether the object has a well defined length that is zero. These are two completely different checks, which often (but far from always) overlap. Embrace the duck type- type safe python is a myth.
isn't the expected behaviour exactly identical on any object that has len defined:
"By default, an object is considered true unless its class defines either a bool() method that returns False or a len() method that returns zero, when called with the object."
ps: well your objection is I guess that we cant know in advance if that said object has len defined such as being a collection so this question does not really apply to your post I guess.
It's not the same, and you kinda answered your own question with that quote. Consider what happens when an object defines both dunder bool and dunder len. It's possible for dunder len to return 0 while dunder bool returns True, in which case the falsy-ness of the instance would not depend at all on the value of len
I write a lot of Python. I hate it when people use "X is more pythonic" as some kind of argument for what is a better solution to a problem. I also have a hang up with people acting like python has any form of type safety, instead of just embracing duck typing.This lands us at the following:
The article states that "you can check a list for emptiness in two ways:
if not mylist
orif len(mylist) == 0
". Already here, a fundamental mistake has been made: You don't know (and shouldn't care) whethermylist
is a list. These two checks are not different ways of doing the same thing, but two different checks altogether. The first checks whether the object is "falsey" and the second checks whether the object has a well defined length that is zero. These are two completely different checks, which often (but far from always) overlap. Embrace the duck type- type safe python is a myth.isn't the expected behaviour exactly identical on any object that has len defined:
"By default, an object is considered true unless its class defines either a bool() method that returns False or a len() method that returns zero, when called with the object."
ps: well your objection is I guess that we cant know in advance if that said object has len defined such as being a collection so this question does not really apply to your post I guess.
It's not the same, and you kinda answered your own question with that quote. Consider what happens when an object defines both dunder bool and dunder len. It's possible for dunder len to return 0 while dunder bool returns True, in which case the falsy-ness of the instance would not depend at all on the value of len