2009-12-26 12 views

Respuesta

13

Recuerde que puede subclasificar las clases de excepción integradas de Python (y TypeError seguramente sería la clase de excepciones incorporada correcta para plantear aquí; eso es lo que Python plantea si el número de argumentos no coincide con la firma, en condiciones normales casos sin *a o **k formularios en la firma). Me gusta tener todos los paquetes de definir sus propias class Error(Exception), y luego específicas excepciones según sea necesario se pueden multiplicar heredan según el caso, por ejemplo .:

class WrongNumberOfArguments(thispackage.Error, TypeError): 

Entonces, me raise WrongNumberOfArguments cuando detecto una situación tal problema.

De esta manera, cualquier persona que conozca este paquete puede atrapar thispackage.Error, si necesitan ocuparse de cualquier error específico del paquete, mientras que otras personas (supuestamente más arriba en la cadena de llamada) llaman todavía la captura más genérica TypeError para tratar cualquier error como "número incorrecto de argumentos utilizados en una llamada de función".

+0

Este es un bello ejemplo del uso de la herencia múltiple muy bien. Gracias. –

3

Haría una específica. Puede atraparlo y lidiar con esa excepción específica ya que es una circunstancia especial que usted creó :)

4

Si (como usted dice en uno de los comentarios) que este es un error del programador, entonces puede plantear AssertionError:

def two(**kwargs): 
    assert len(kwargs) == 2, "Please only provide two args" 

Por cierto, si solo tiene tres argumentos con nombre, ** kwargs parece una forma extraña de hacerlo. Más natural podría ser:

def two(a=None, b=None, c=None): 
    pass 
0

me gustaría utilizar un ValueError, o una subclase de los mismos: "Se genera cuando un sistema incorporado en la operación o función recibe un argumento que tiene el tipo correcto, pero un valor apropiado, y la situación es no descrito por una excepción más precisa como IndexError ".

Pasar valores 3 o 1 cuando se requieren exactamente 2 sería técnicamente un valor inapropiado si considera todos los argumentos una sola tupla ... Al menos en mi opinión! :)

11

¿Por qué no hacer lo que hace python?

>>> abs(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes exactly one argument (3 given) 
0

Recomiendo una excepción personalizada. De esta manera:

class NeedExactlyTwo(ValueError): 
    pass 

Luego puede raise NeedExactlyTwo en su código.

Asegúrese de documentar esto en la docstring para su función.

Cuestiones relacionadas