type(), isinstance() para obtener y determinar el tipo en Python

Negocio

En Python, las funciones incorporadas type() e isinstance() se utilizan para obtener y comprobar el tipo de un objeto, como una variable, y para determinar si es de un tipo determinado.

Aquí se explican los siguientes contenidos, junto con un código de ejemplo.

  • Obtener y comprobar el tipo de objeto:type()
  • Determinación del tipo de objeto:type(),isinstance()
    • Determinación del tipo mediante type()
    • Determinación del tipo mediante isinstance()
    • Diferencia entre type() y isinstance()

En lugar de determinar el tipo de un objeto, se puede utilizar el manejo de excepciones o la función incorporada hasattr() para determinar si un objeto tiene los métodos y atributos correctos.

Obtener y comprobar el tipo de objeto: tipo()

type(object) es una función que devuelve el tipo del objeto pasado como argumento. Se puede utilizar para averiguar el tipo de un objeto.

print(type('string'))
# <class 'str'>

print(type(100))
# <class 'int'>

print(type([0, 1, 2]))
# <class 'list'>

El valor de retorno de type() es un objeto de tipo como str o int.

print(type(type('string')))
# <class 'type'>

print(type(str))
# <class 'type'>

Determinación del tipo de objeto: type(), isinstance()

Utilice type() o isinstance() para determinar el tipo.

Determinación del tipo mediante type()

Comparando el valor de retorno de type() con un tipo arbitrario, se puede determinar si el objeto es de cualquier tipo.

print(type('string') is str)
# True

print(type('string') is int)
# False
def is_str(v):
    return type(v) is str

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False

Si quiere determinar si es uno de varios tipos, utilice el operador in y una tupla o lista de varios tipos.

def is_str_or_int(v):
    return type(v) in (str, int)

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False

También es posible definir funciones que cambien el procesamiento dependiendo del tipo de argumento.

def type_condition(v):
    if type(v) is str:
        print('type is str')
    elif type(v) is int:
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Determinación del tipo mediante isinstance()

isinstance(objeto, clase) es una función que devuelve verdadero si el objeto del primer argumento es una instancia del tipo o subclase del segundo argumento.

El segundo argumento puede ser una tupla de tipos. Si es una instancia de cualquiera de los dos tipos, se devuelve true.

print(isinstance('string', str))
# True

print(isinstance(100, str))
# False

print(isinstance(100, (int, str)))
# True

Una función similar al ejemplo de la determinación del tipo mediante type() puede escribirse como sigue

def is_str(v):
    return isinstance(v, str)

print(is_str('string'))
# True

print(is_str(100))
# False

print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
    return isinstance(v, (int, str))

print(is_str_or_int('string'))
# True

print(is_str_or_int(100))
# True

print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
    if isinstance(v, str):
        print('type is str')
    elif isinstance(v, int):
        print('type is int')
    else:
        print('type is not str or int')

type_condition('string')
# type is str

type_condition(100)
# type is int

type_condition([0, 1, 2])
# type is not str or int

Diferencia entre type() y isinstance()

La diferencia entre type() e isinstance() es que isinstance() devuelve verdadero para las instancias de las subclases que heredan la clase especificada como segundo argumento.

Por ejemplo, se define la siguiente superclase (clase base) y subclase (clase derivada)

class Base:
    pass

class Derive(Base):
    pass

base = Base()
print(type(base))
# <class '__main__.Base'>

derive = Derive()
print(type(derive))
# <class '__main__.Derive'>

La determinación del tipo mediante type() devuelve verdadero cuando los tipos coinciden, pero isinstance() devuelve verdadero incluso para las superclases.

print(type(derive) is Derive)
# True

print(type(derive) is Base)
# False

print(isinstance(derive, Derive))
# True

print(isinstance(derive, Base))
# True

Incluso para los tipos estándar, por ejemplo, el tipo booleano bool (true,false), hay que tener cuidado. bool es una subclase del tipo integer, por lo que isinstance() devuelve true incluso para un int del que se hereda.

print(type(True))
# <class 'bool'>

print(type(True) is bool)
# True

print(type(True) is int)
# False

print(isinstance(True, bool))
# True

print(isinstance(True, int))
# True

Si quiere determinar el tipo exacto, utilice type(); si quiere determinar el tipo teniendo en cuenta la herencia, utilice isinstance().

La función incorporada issubclass() también se proporciona para determinar si una clase es una subclase de otra clase.

print(issubclass(bool, int))
# True

print(issubclass(bool, float))
# False
Copied title and URL