|I l@ve RuBoard|
3.3 Testing if an Object Is String-Like
Credit: Luther Blissett
def isAString(anobj): return type(anobj) is type('')
However, this approach is not appropriate, as it wilfully destroys one of Python's greatest strengths梥mooth, 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
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.
|I l@ve RuBoard|