2010-07-25 7 views
10

¿Es común en Python seguir realizando pruebas de los valores de tipo cuando se trabaja en modo OOP?¿Es común/buena práctica probar valores de tipo en Python?

class Foo(): 
    def __init__(self,barObject): 
     self.bar = setBarObject(barObject) 

    def setBarObject(barObject); 
     if (isInstance(barObject,Bar): 
      self.bar = barObject 
     else: 
      # throw exception, log, etc. 

class Bar(): 
    pass 

O puedo utilizar un enfoque más suelto, como:

class Foo(): 
    def __init__(self,barObject): 
     self.bar = barObject 

class Bar(): 
    pass 

Respuesta

19

No, de hecho, es abrumadoramente común no para la prueba de valores de tipo, al igual que en el segundo enfoque. La idea es que un cliente de su código (es decir, algún otro programador que use su clase) pueda pasar cualquier tipo de objeto que tenga todos los métodos o propiedades apropiados. Si no es una instancia de alguna clase en particular, está bien; tu código nunca necesita saber la diferencia. Esto se llama pato escribiendo, debido al adagio "Si grazna como un pato y vuela como un pato, bien podría ser un pato" (bueno, ese no es el adagio actual, pero tengo la esencia de eso, creo)

Un lugar donde verá esto es en la biblioteca estándar, con cualquier función que maneje la entrada o salida de archivos. En lugar de requerir un objeto real file, tomarán cualquier cosa que implemente el método read() o readline() (según la función) o write() para escribir. De hecho, a menudo verá esto en la documentación, p. con tokenize.generate_tokens, lo que me acaba de pasar a estar buscando en el día de hoy:

El generador generate_tokens() requiere un argumento, readline, que debe ser un objeto invocable que proporciona la misma interfaz que el método de readline() incorporada objetos de archivo (consulte la sección File Objects). Cada llamada a la función debe devolver una línea de entrada como una cadena.

Esto le permite utilizar un objeto StringIO (como un archivo en memoria), o algo más loca como un cuadro de diálogo, en lugar de un archivo real.

En su propio código, solo acceda a las propiedades de un objeto que necesite, y si es el tipo incorrecto de objeto, una de las propiedades que necesita no estará allí y arrojará una excepción.

+4

Segundo eso. También vea [EAFP] (http://docs.python.org/glossary.html#term-eafp): es más fácil pedir perdón que permiso. –

+0

esto es muy interesante. Después de todo, deberíamos disfrutar de las características de las pitones en lugar de defendernos de ellas. –

1

Creo que es una buena práctica verificar entrada para el tipo. Es razonable suponer que si le pedías a un usuario que proporcionara un tipo de datos, podrían darte otro, por lo que debes codificar para defenderte de esto.

Sin embargo, parece una pérdida de tiempo (tanto escribir como ejecutar el programa) para comprobar el tipo de entrada que genera el programa independientemente de la entrada. Como en un lenguaje fuertemente tipado, el tipo de comprobación no es importante para defenderse contra programador error.

Básicamente, compruebe la entrada pero nada más para que el código pueda ejecutarse sin problemas y los usuarios no tengan que preguntarse por qué obtuvieron una excepción en lugar de un resultado.

+1

Probablemente este sea un buen consejo en otros idiomas, pero no es una práctica común en Python. Vea la respuesta de David arriba. –

+1

comentario muy importante. sigue probando la ENTRADA. la diferencia entre el error del programador y el error del usuario es importante. Gracias. –

+0

No estoy seguro; Aprendí Python de MIT OCW y los profesores del MIT siempre hablaban de "codificación defensiva", incluso en python –

0

Si su alternativa a la verificación de tipo es otra que contiene manejo de excepciones, entonces debería considerar pato escribir un nivel, admitir tantos objetos con los métodos que necesita de la entrada y trabajar dentro de un intento. Puede entonces excepto (y excepto tan específicamente como sea posible) eso. El resultado final no sería diferente a lo que tienes allí, pero es mucho más versátil y pitónico.

Todo lo demás que se necesita decir acerca de la pregunta real, si es común/buena práctica o no, creo que ha sido respondida de manera excelente por David's.

0

Estoy de acuerdo con algunas de las respuestas anteriores, ya que por lo general nunca reviso el tipo de una función a otra.

Sin embargo, como alguien más mencionó, cualquier cosa aceptada de un usuario debería ser revisada, y para cosas como esta uso expresiones regulares. Lo bueno de usar expresiones regulares para validar la entrada del usuario es que no solo se puede verificar que los datos estén en el formato correcto, sino que también se puede analizar la entrada en una forma más conveniente, como una cadena en un diccionario.

Cuestiones relacionadas