2011-11-28 10 views
17

¿Cuál es la clase de excepción "adecuada" que se debe generar cuando una de mis funciones detecta que None ha pasado donde se requiere un valor de argumento? Por ejemplo:Excepción adecuada para plantear si se encontró Ninguno como argumento

def MyFunction(MyArg1, MyArg2): 

    if not MyArg2: 
      raise ?Error? 

Creo que he visto TypeError utiliza aquí (y es verdad que estoy recibiendo un NoneType donde se espera algún otro tipo) pero eso no me parece que sea muy adecuado para esta situación donde creo que la Excepción podría ser más explícita.

+0

No debería estar haciendo este tipo de argumento comprobando en absoluto. Simplemente deja que falle más abajo con la excepción en la que falle. (Y si realmente * debe * hacer esto, 'TypeError' es la excepción correcta. Agregue una cadena de explicación para hacerlo más específico.) –

+0

Probablemente plantearía un' TypeError', eche un vistazo a las excepciones incorporadas de python documentación: http://docs.python.org/library/exceptions.html –

+0

@Sven: suelo hacer lo que sugiere, pero este es un caso especial en el que quiero que se realice esta comprobación. –

Respuesta

29

No hay excepción incorporada "argumento inválido" o "puntero nulo" en Python. En su lugar, la mayoría de las funciones aumentan TypeError (tipo no válido como NoneType) o ValueError (tipo correcto, pero el valor está fuera del dominio aceptado).

Si su función requiere un objeto de una clase particular y obtiene None, probablemente debería aumentar TypeError como señaló. En este caso, se debe comprobar si hay None explícitamente, sin embargo, desde un objeto del tipo correcto puede evaluar a booleano False si implementa __nonzero__/__bool__:

if MyArg2 is None: 
    raise TypeError 

documentación de Python:

-1

sólo tiene que utilizar afirman:

assert type(MyArg2) == int 

O, alternativamente:

assert type(MyArg2) != None 

Esto evitará que alguien lo rebasen el tipo incorrecto, así como hacer frente a la cuestión Ninguno. Devolverá un AssertionError, as per the docs.

+1

Esto es completamente contrario al espíritu de tipado de pato de Python. Impone restricciones innecesarias en la aplicabilidad del código. (No es mi voto a la baja, por cierto) –

+1

@SvenMarnach Hmm, lo he usado con éxito * debido a * la mecanografía pato.A saber, el tipado del pato ha ocultado * por qué * algo está fallando. Si te encuentras en la necesidad de decir esto y tal debe ser así antes de comenzar, entonces afirmar es simplemente una manera conveniente de hacerlo. Por ejemplo, escriba una función con un ciclo for sobre una variable de entrada. Se supone que es una lista de nombres de archivos para globbing. ¿Qué sucede si en vez de pasar una lista con un elemento, pasas una cadena con caracteres globales? –

+1

El problema con la afirmación es que ignora los valores que podrían servir perfectamente como (en este ejemplo) enteros, incluidos enteros largos, flotantes (en muchas circunstancias, p. Ej. 'Rango()') y cualquier objeto que implemente el '__int__() 'método especial. Un mejor enfoque, si cree que necesita este tipo de cosas, podría ser simplemente tratar de forzar el argumento a un número entero al comienzo del método, p. 'MyArg2 = int (MyArg2)'. – kindall

2

La mayor parte de la función python aumenta TypeError si se pasa None como argumento. Tome cualquier función, digamos chr(None) y vea que aumenta TypeError.

2

Como han señalado otros, TypeError o ValueError sería natural. Si no parece lo suficientemente específico, podría subclasificar cualquiera de las dos excepciones que se ajuste mejor. Esto permite un manejo consistente de los argumentos no válidos para una amplia clase de funciones a la vez que le proporciona más detalles para la función en particular.

Cuestiones relacionadas