3.3 Testing if an Object Is String-Like
Credit: Luther Blissett
3.3.1 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).
3.3.2 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 1
3.3.3 Discussion
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 check for more string-like features
of the object anobj. For example:
try: anobj.lower( ) + anobj + ''
But in my experience, the simple test shown in the solution usually
does exactly what I need.
The most Pythonic approach to type validation (or any validation
task, really) is to try to perform whatever task you need to do,
detecting and handling any errors or exceptions that might result if
the situation is somehow invalid.
try/except works very well for
this. Sometimes, as in this recipe, you may choose some simple task,
such as concatenating to the empty string, as a stand-in for a much
richer set of properties (such as all the various operations and
methods available on string objects).
3.3.4 See Also
Documentation for the built-in functions
isinstance, type, and
issubclass in the Library
Reference.
|