Re:Python built-ins worth learning (2019)
by saila on Monday March 21, 2022 @09:00PM
(#30761687)
I don't see how using len() this way is any different than doing an isinstance check. You're essentially saying, "If this object doesn't respond to len(), raise a TypeError."
[ Parent
| on HN ]
Re:Python built-ins worth learning (2019)
by dragonwriter on Thursday March 24, 2022 @02:07AM
(#30786773)
> I don't see how using len() this way is any different than doing an isinstance check.
It's a protocol (structural) runtime type check, not a class (nominal) runtime type check.
Perhaps true but misses the point. If you’re using len() for type checking, it’s essentially no different than doing isinstance(items, Sized). The latter explicitly calls out what you’re doing and makes it clear, to me, that’s it’s not really correct, in that it doesn’t show your intent, which is to enforce a sequence of items in a container not that the object has a size.
Re:Python built-ins worth learning (2019)
by mturmon on Thursday March 24, 2022 @01:54AM
(#30786729)
Tuple, list, and numpy array are all different isinstance()’s, so I’d have to call them all out. len() avoids that.
This is incorrect, because you can generally do this for sequence types:
isinstance(items, Sequence)
Or perhaps: isinstance(items, Iterable) # works with numpy arrays
Or, equivalent to using len() for type checking, you could do: isinstance(items, Sized)