Problema: Tengo que verificar que el valor devuelto sea un diccionario de Python.

Q1. ¿Cuál de estas opciones es la forma correcta de hacer esto?

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)

Luego están las otras variantes que utilizan el operador is en lugar de ==.

Q2 Muchas personas dicen que verificar el tipo de un objeto generalmente es una mala práctica, pero con respecto a mi problema inicial, ¿tengo otra opción?

3
Paolo 2 ago. 2011 a las 03:28

3 respuestas

La mejor respuesta

Q1. ¿Cuál de estas opciones es la forma correcta de hacer esto?

No pierda el tiempo en la verificación de tipos.

Es propenso a errores porque se basa en suposiciones.

Q2 ... ¿tengo alguna otra opción?

Si, haz esto.

try:
    x.the_dict_operation()
except TypeError:
    # x was not the expected type for the operation
    raise # or whatever.

En la mayoría de los casos, esto equivale a "no hacer nada".

Solo escribe el código. Si "de alguna manera" un sociópata malicioso usa el tipo incorrecto, simplemente se bloqueará como se supone que debe hacerlo.

8
S.Lott 1 ago. 2011 a las 23:31

Confíe en el comportamiento , no en el tipo real (vea otras respuestas).

Muchos objetos pueden actuar como diccionarios, no desea obligar a los usuarios de su función / API a usar dictados simples, ¿verdad?

En el lado pragmático:

>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
2
Karoly Horvath 1 ago. 2011 a las 23:38

Verifique __getitem__ en lugar de verificar el tipo. Si realmente desea verificar el tipo, cualquiera está bien (bueno, excepto type(x) == type(dict), eso nunca será cierto para una instancia de dict). isinstance es probablemente la forma más estándar de hacerlo.

1
Cat Plus Plus 1 ago. 2011 a las 23:31