2010-09-22 1031 views
16

He encontrado el siguiente error en mi código de esta semana:¿Hay herramientas que puedan detectar errores como este?

import datetime 

d = datetime.date(2010,9,24) 
if d.isoweekday == 5: 
    pass 

Sí, debe ser d.isoweekday() en su lugar.

Lo sé, si hubiera tenido un caso de prueba para esto me habría salvado. Comparar una función con 5 no es muy útil. Oh, no culpo a Python por esto.

Mi pregunta: ¿Hay herramientas que puedan detectar errores como este?

+3

"si tuviera un caso de prueba para esto". ¿No es esa la respuesta a tu pregunta? "Escribe una prueba unitaria". –

+0

@ S.Lott Me cubrí para esta respuesta. Entonces, no. :) –

+0

Te estás perdiendo el punto. Dado (a) la ausencia de una prueba y (b) las respuestas que tiene, tendrá que comenzar a escribir pruebas. –

Respuesta

7

Como alternativa , la mayoría de los proyectos de Python son unidad de prueba y el sistema probado. Si tiene ambas (o incluso solo pruebas unitarias), encontrará su problema junto con casi cualquier otro problema.

Como dekomote dijo, esto es sintácticamente válido. Python es no tipado estáticamente por lo que no se puede tomar como un error. A lo sumo podría ser una advertencia.

EDITAR: Python está fuertemente tipado, solo se comprueba el tipo en tiempo de ejecución.

+1

-1 python está fuertemente tipado. No está _statically_ tipeado. Esta no es una pequeña distinción. Además, ni siquiera debería ser una advertencia porque la comparación es perfectamente válida. – aaronasterling

+0

Gracias por la corrección. Bueno, no cambia mucho a menos que una herramienta sea capaz de emular una ejecución sin ejecutar el programa. De lo contrario, solo podría ser una suposición. – Wernight

+0

+1 por ser el único en las respuestas para recomendar pruebas unitarias (S. Lott está en él en los comentarios) – aaronasterling

3

Echa un vistazo pylint puede ser capaz de conseguir eso. Encuentra muchos errores.

+2

No encontrará este error. – dekomote

+0

Tampoco lo hace [pychecker] (http://pychecker.sourceforge.net/). –

+2

Eso es porque no hay ningún error aquí. d.isoweekday == 5 es una declaración válida. – dekomote

3

Bueno, esto no es un error en python per se porque en Python, las funciones son objetos invocables. Puede hacer que cualquier objeto sea invocable implementando __call__. Entonces d.isoweekday == 5 es una declaración válida. Esto será falso.

En cuanto a otros errores, sugiero la comprobación hacia fuera pyflakes - http://divmod.org/trac/wiki/DivmodPyflakes

Cuestiones relacionadas