python - parameter - Compruebe si algo es una lista
type python (4)
¿Cuál es la forma más fácil de verificar si algo es una lista?
Un método doSomething
tiene los parámetros b
. En el método, recorrerá la lista a
y hará algo. Me gustaría una forma de asegurarme de que a
es una list
, antes de recorrer en bucle, evitando así un error o la desafortunada circunstancia de pasar una cadena y luego recuperar una letra de cada bucle.
Esta pregunta se debe haber hecho antes, sin embargo, mis googles me fallaron. Aclamaciones.
Me gustaría una forma de asegurarme de que una es una lista, antes de recorrer
Documentar la función.
La comprobación de tipos daña la generalidad, la simplicidad y la capacidad de mantenimiento de su código. Rara vez se usa en buenos programas idiomáticos de Python.
Hay dos razones principales por las que las personas quieren escribir:
Para emitir errores si la persona que llama proporciona el tipo incorrecto.
Esto no vale la pena su tiempo. Si el usuario proporciona un tipo incompatible para la operación que está realizando, ya se generará un error cuando se alcance la compatibilidad. Es preocupante que esto no ocurra de inmediato, pero por lo general no toma mucho tiempo y da como resultado un código más robusto, simple, eficiente y más fácil de escribir.
A menudo la gente insiste en esto con la esperanza de poder atrapar todas las cosas tontas que un usuario puede hacer. Si un usuario está dispuesto a hacer cosas arbitrariamente tontas, no hay nada que puedas hacer para detenerlo. La verificación de tipos principalmente tiene el potencial de mantener a un usuario que viene con sus propios tipos que son reemplazos directos para los reemplazados o cuando el usuario reconoce que su función debería ser polimórfica y proporciona algo diferente que puede aceptar la misma operación.
Si tuviera un sistema grande en el que un montón de cosas hechas por mucha gente debieran encajar bien, usaría un sistema como
zope.interface
para hacer pruebas de que todo encaja bien.Hacer diferentes cosas en función de los tipos de argumentos recibidos.
Esto empeora tu código porque tu API es inconsistente. Una función o método debe hacer una cosa, no cosas fundamentalmente diferentes. Esto termina siendo una característica que no vale la pena soportar.
Un escenario común es tener un argumento que puede ser un foo o una lista de foos. Una solución más limpia es simplemente aceptar una lista de foos. Su código es más simple y más consistente. Si es un caso de uso común e importante solo tener un foo, puede considerar tener otro método / función conveniente que llame al que acepta una lista de foos y no pierda nada. Proporcionar la primera API no solo habría sido más complicado y menos consistente, sino que se rompería cuando los tipos no fueran los valores exactos esperados; en Python distinguimos entre los objetos en función de sus capacidades, no de sus tipos reales. Casi siempre es mejor aceptar un iterable arbitrario o una secuencia en lugar de una lista y cualquier cosa que funcione como un foo en lugar de requerir un foo en particular.
Como puede ver, no creo que ninguna de las dos razones sea lo suficientemente convincente como para realizar una comprobación de tipo en circunstancias normales.
Para habilitar más casos de uso, pero aún así tratar las cadenas como escalares, no verifique si hay una lista, verifique que no sea una cadena:
if not isinstance(a, basestring):
...
Por lo general, no se considera un buen estilo para realizar una comprobación de tipos en Python, pero intente
if isinstance(a, list):
...
(Creo que también puede comprobar si existe a.__iter__
).