[Tutor] "if clause" in list comprehensions.
alan.gauld at btinternet.com
Tue Oct 20 00:00:53 CEST 2009
Is there any compelling reason to write:
>[item.upper() for item in my_list if isinstance(item, basestring)]
>rather than the following?
>[item.upper() for item in my_list if hasattr(item, 'upper')]What happens if you have an object in your list that has
an 'upper' merthod that, say, reboots your PC into an
upper level of admin access? Or that sets the bank
account credit limit to the upper limit?
Your list comprehension will happily run and apply upper
to the object but the result may not be what you expected.
If you check isinstance you know that you are working with
some kind of string at least. (A programmer could still
override upper do do some wacky thing but then that
programmer is abusing upper, whereas, in the bank account
case it's a perfectly valid application of upper() )
Even more to the point the 'upper' that hasattr() finds may
not be callable, it could be the upper value of a range for
example. Then when you try to use it in the comprehension
you will get an error.
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Tutor