isinstance()

isinstance(object, classinfo)
Returns: bool · Added in v3.0 · Updated March 13, 2026 · Built-in Functions
built-in type-checking types object-oriented

The isinstance() function checks whether an object is an instance of a class or of a subclass thereof. It can also check against a tuple of classes, making it versatile for type validation. This is the Pythonic way to perform type checks, preferred over direct type() comparison because it respects inheritance.

Syntax

isinstance(object, classinfo)

Parameters

ParameterTypeDefaultDescription
objectobjectAny Python object to check. Position-only parameter.
classinfoclass | tupleA class, abstract base class, or tuple of classes. Can also be a union type (3.10+).

Returns: True if object is an instance of classinfo or any class in the tuple; False otherwise.

Examples

Basic type checking

# Check against a single class
print(isinstance(42, int))
# True

print(isinstance("hello", str))
# True

print(isinstance([1, 2, 3], list))
# True

Checking against multiple classes

# Check against a tuple of classes
value = "hello"
print(isinstance(value, (int, str, float)))
# True

value = 3.14
print(isinstance(value, (int, str)))
# False

Inheritance support

isinstance() respects inheritance, unlike type() comparison:

class Animal:
    pass

class Dog(Animal):
    pass

dog = Dog()
print(isinstance(dog, Dog))
# True

print(isinstance(dog, Animal))
# True  # Dog IS an Animal via inheritance

print(type(dog) == Animal)
# False  # type() doesn't respect inheritance

Checking against abstract base classes

from collections.abc import Iterable, MutableSequence

my_list = [1, 2, 3]
print(isinstance(my_list, list))
# True

print(isinstance(my_list, Iterable))
# True  # list implements Iterable

print(isinstance(my_list, MutableSequence))
# True  # list is a MutableSequence

Practical use in functions

def process(data):
    if isinstance(data, str):
        return data.upper()
    elif isinstance(data, list):
        return sum(data)
    elif isinstance(data, dict):
        return len(data)
    else:
        return "Unknown type"

print(process("hello"))
# HELLO

print(process([1, 2, 3]))
# 6

print(process({"a": 1}))
# 1

With custom classes

class User:
    def __init__(self, name):
        self.name = name

class Admin(User):
    def __init__(self, name, permissions):
        super().__init__(name)
        self.permissions = permissions

user = User("Alice")
admin = Admin("Bob", ["read", "write"])

print(isinstance(user, User))
# True

print(isinstance(admin, User))
# True  # Admin is a subclass of User

print(isinstance(admin, Admin))
# True

isinstance() vs type()

Aspectisinstance()type()
InheritanceRespects subclass relationshipsExact match only
Code stylePythonicLess pythonic
Multiple typesSupports tupleRequires multiple comparisons
Abstract basesWorks with ABCsDoesn’t recognize ABCs

Common Patterns

Type hints validation at runtime

def validate_config(config: dict) -> dict:
    required_keys = ["name", "value"]
    for key in required_keys:
        if key not in config:
            raise ValueError(f"Missing required key: {key}")
    
    if not isinstance(config["value"], (int, float)):
        raise TypeError("value must be numeric")
    
    return config

Duck typing fallback

def get_length(obj):
    # Check if it has __len__ (duck typing)
    if hasattr(obj, "__len__"):
        return len(obj)
    # Fallback to isinstance for known types
    elif isinstance(obj, str):
        return len(obj)
    else:
        raise TypeError("Object has no length")

Processing mixed types

def summarize(items):
    total = 0
    strings = []
    
    for item in items:
        if isinstance(item, (int, float)):
            total += item
        elif isinstance(item, str):
            strings.append(item)
    
    return {"sum": total, "strings": strings}

result = summarize([1, "hello", 2, "world", 3])
print(result)
# {'sum': 6, 'strings': ['hello', 'world']}

Errors

TypeError for invalid classinfo

# Invalid classinfo type
isinstance(42, "int")
# TypeError: isinstance() arg 2 must be a type, a tuple of types, or a union

## See Also

- [built-in::type](/reference/built-in-functions/type/) — returns the type of an object (doesn't respect inheritance)
- [built-in::issubclass](/reference/built-in-functions/issubclass/) — checks class inheritance relationships
- [built-in::hasattr](/reference/built-in-functions/hasattr/) — checks if an object has a specific attribute