What's the canonical way to check for type in Python?
python, types
Solution
Use `isinstance` to check if `o` is an instance of `str` or any subclass of `str`:
if isinstance(o, str):
To check if the type of `o` is exactly `str`, excluding subclasses of `str`:
if type(o) is str:
See Built-in Functions in the Python Library Reference for relevant information.
Checking for strings in Python 2
For Python 2, this is a better way to check if `o` is a string:
if isinstance(o, basestring):
because this will also catch Unicode strings. `unicode` is not a subclass of `str`; both `str` and `unicode` are subclasses of `basestring`. In Python 3, `basestring` no longer exists since there's a strict separation of strings (`str`) and binary data (`bytes`).
Alternatively, `isinstance` accepts a tuple of classes. This will return `True` if `o` is an instance of any subclass of any of `(str, unicode)`:
if isinstance(o, (str, unicode)):
Problem
How do I check if an object is of a given type, or if it inherits from a given type? How do I check if the object `o` is of type `str`? Beginners often wrongly expect the string to already be "a number" - either expecting Python 3.x `input` to convert type, or expecting that a string like `'1'` is also simultaneously an integer. This is the wrong canonical for those questions. Please carefully read the question and then use How do I check if a string represents a number (float or int)?, How can I read inputs as numbers? and/or Asking the user for input until they give a valid response as appropriate.
Related problems
- How can I read inputs as numbers?
- Asking the user for input until they give a valid response
- How to check if an object has an attribute?
- Is there a difference between "==" and "is"?
- How to check if a number is a np.float64 or np.float32 or np.float16?
- How do I check if a string represents a number (float or int)?