Python Basic Doubt

Terry Reedy tjreedy at udel.edu
Sat Aug 10 15:46:13 EDT 2013


On 8/10/2013 2:00 PM, Xavi wrote:
> Hello,
>
> El 10/08/2013 18:40, Tim Chase escribió:
>> Generally, if you are using the "is" operator to compare against
>> anything other than None, you're doing it wrong. There are exceptions
>> to this, but it takes knowing the particulars.
>
> Now I have one doubt, I use 'is' to compare basic types in python 3, for
> example .-
>
> v = []
> if type(v) is list:
>      print('Is list...')
>
> Because I think it is more clear and faster than .-
> type(v) == [].__class__  ... or ... isinstance(v, list)
>
> Is this correct?

It depends on the context. If one is writing a test for a function that 
is defined as returning a list, such as the builtin function *sorted*, 
then 'is list' would be correct.

When one knows the type, as in your toy snippet, 'is list' is nonsensical.

In a more typical situation, as when testing the argument to a function 
in the body of a function, then 'isinstance(arg, list)' is almost 
certainly more correct (but often still not best) as the function should 
usually accept at least any list subclass instance.

def popslice(lis, start, stop=None, step=0):
   if not isinstance(lis, list):
     raise TypeError("Can only popslice a list")
   if stop is None:  # here is where is *should* be used
     start, stop = 0, start
   ret = lis[start:stop:step]
   del lis[start:stop:step]
   return ret

lis = list(range(10))
print(popslice(lis, 2, 9, 2), lis)
 >>>
[2, 4, 6, 8] [0, 1, 3, 5, 7, 9]

However, why exclude a mutable sequence that support slices but is not 
specifically a list?

def popslice(seq, start, stop=None, step=0):
   if stop is None:  # here is where is *should* be used
     start, stop = 0, start
   ret = seq[start:stop:step]
   del seq[start:stop:step]
   return ret

Bad inputs will raise TypeErrors.
TypeError: 'int' object is not subscriptable
TypeError: 'tuple' object doesn't support item deletion
It this is not good enough, wrap the body in
   try:
     ...
   except TypeError as e:
     raise TypeError("your custom message here")

-- 
Terry Jan Reedy





More information about the Python-list mailing list