Something like this, I presume? You could do some checks to see if it's a single string.
>>> def checktype(obj):
return bool(obj) and all(isinstance(elem, basestring) for elem in obj)
>>> obj1 = ['foo','bar','bar','black','sheet']
>>> obj2 = [1,2,3,4,5,'bar']
>>> obj3 = 'bar'
>>> for i in [obj1, obj2, obj3] :
print checktype(i)
True
False
True
Why check for basestring instead of str?
You should check for basestring instead of str since it's a common class from which both the str and unicode types inherit from. Checking only the str leaves out the unicode types.
As per Steven Rumbalski's suggestions, if you need to specifically check for a list of strings, you could do.
>>> def is_list_of_strings(lst):
return bool(lst) and not isinstance(lst, basestring) and all(isinstance(elem, basestring) for elem in lst)
# You could break it down into `if-else` constructs to make it clearer to read.
>>> for i in [obj1, obj2, obj3] :
print is_list_of_strings(i)
True
False
False
EDIT - As per abarnert's suggestion, you could also check for a list instead of not isinstance(lst, basestring), the code would get rewritten as.
>>> def is_list_of_strings(lst):
return bool(lst) and isinstance(lst, list) and all(isinstance(elem, basestring) for elem in lst)
# You could break it down into `if-else` constructs to make it clearer to read.
>>> for i in [obj1, obj2, obj3] :
print is_list_of_strings(i)
True
False
False
Moving away from one liners, we could use.
>>> def is_list_of_strings(lst):
if lst and isinstance(lst, list):
return all(isinstance(elem, basestring) for elem in lst)
else:
return False
checktypetois_list_of_string.[]a list of strings, or not?[]wouldn't be a list of string, it's an empty list.[]a valid list of 0 anythings, so that's what functions likealldo. So an answer that just relies onall(like Sukrit Kalra's current version) is going to returnTruerather thanFalsein that case. The simplest fix is to doif obj and [rest of check].[]is a valid empty list of strings. I have checked it by validating and it works fine.