Determinar el tipo de un objeto Python
Determine el tipo de un objeto con type
>>> obj = object()
>>> type(obj)
<class 'object'>
Aunque funciona, evite los atributos de subrayado doble como __class__
: no son semánticamente públicos y, aunque tal vez no en este caso, las funciones integradas suelen tener un mejor comportamiento.
>>> obj.__class__ # avoid this!
<class 'object'>
verificación de tipo
¿Hay una manera simple de determinar si una variable es una lista, un diccionario u otra cosa? Estoy recuperando un objeto que puede ser de cualquier tipo y necesito poder notar la diferencia.
Bueno, esa es una pregunta diferente, no use type - use isinstance
:
def foo(obj):
"""given a string with items separated by spaces,
or a list or tuple,
do something sensible
"""
if isinstance(obj, str):
obj = str.split()
return _foo_handles_only_lists_or_tuples(obj)
Esto cubre el caso en el que su usuario podría estar haciendo algo inteligente o sensato al subclasificar str
, de acuerdo con el principio de la sustitución de Liskov, desea poder usar instancias de subclase sin romper su código, y lo isinstance
admite.
Usa abstracciones
Aún mejor, puede buscar una clase base abstracta específica de collections
o numbers
:
from collections import Iterable
from numbers import Number
def bar(obj):
"""does something sensible with an iterable of numbers,
or just one number
"""
if isinstance(obj, Number): # make it a 1-tuple
obj = (obj,)
if not isinstance(obj, Iterable):
raise TypeError('obj must be either a number or iterable of numbers')
return _bar_sensible_with_iterable(obj)
O simplemente no explícitamente la verificación de tipo
O, quizás lo mejor de todo, utilice la escritura de pato y no verifique explícitamente su código. La escritura de patos admite la sustitución de Liskov con más elegancia y menos verbosidad.
def baz(obj):
"""given an obj, a dict (or anything with an .items method)
do something sensible with each key-value pair
"""
for key, value in obj.items():
_baz_something_sensible(key, value)
Conclusión
- Úselo
type
para obtener realmente la clase de una instancia.
- Use
isinstance
para verificar explícitamente las subclases reales o las abstracciones registradas.
- Y simplemente evite la verificación de tipo donde tenga sentido.