Testing if an Object Is String-Like
Credit: Luther Blissett
Problem
You need to test if an object, typically an argument to a function or method you’re writing, is a string (or more precisely, whether the object is string-like).
Solution
The first thing that comes to mind is type-testing:
def isAString(anobj): return type(anobj) is type('')However, this approach is not appropriate, as it wilfully destroys
one of Python’s greatest strengths—smooth,
signature-based polymorphism. Using the
isinstance
built-in function, which can accept a type
argument in Python 2.0 or later, is only marginally better:
def isAString(anobj): return isinstance(anobj, type(''))This does accept instances of subclasses of type
str (in Python 2.2 or better), but it still
miserably fails to accept such clearly string-like objects as
instances of UserString.UserString and Unicode
strings. What you really want is a way to check if some object is
string-like (i.e., whether it behaves like a string):
def isStringLike(anobj):
try: anobj + ''
except: return 0
else: return 1Discussion
If it walks like a duck, and quacks like a duck,
it’s duck-like enough for our purposes. The
isStringLike
function in this recipe goes only as far as the
“quacks like” part, but
that’s still far better than the disastrous attempts
at rigorous duckhood-checking in the two unacceptable functions named
isAString
in the solution. It’s easy to test a few more
properties by using a richer expression in the try clause, if and when you need to ...