Supongamos que en Python tiene una rutina que acepta tres parámetros nombrados (como ** args), pero dos de estos tres deben completarse. Si solo se completa uno, es un error. Si los tres son, es un error. ¿Qué tipo de error podrías plantear? RuntimeError, una excepción creada específicamente, u otra?¿Qué excepción hacer si se pasó una cantidad incorrecta de argumentos a ** args?
Respuesta
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".
Haría una específica. Puede atraparlo y lidiar con esa excepción específica ya que es una circunstancia especial que usted creó :)
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
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! :)
¿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)
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.
- 1. entidad eliminados pasó a persistir excepción
- 2. Comprobar si un `object [] args` satisface una instancia Delegate?
- 3. calculadora de hipotecas en php cantidad incorrecta
- 4. Visual Studio: ¿Qué pasó con la opción "Romper cuando no se maneja una excepción"?
- 5. ¿por qué colon ":" en Uri pasó a Uri.MakeRelativeUri causar una excepción?
- 6. ¿Se puede pasar una cantidad variable de argumentos a una función?
- 7. ¿Cómo recorrer una va_list si la cantidad de argumentos es desconocida?
- 8. Argparse: compruebe si se han pasado argumentos
- 9. ¿Qué sucede si se lanza una excepción durante finalize()
- 10. ¿Qué pasó con regtlibv12?
- 11. nombre de host excepción incorrecta
- 12. Python, rasing una excepción sin argumentos
- 13. ¿Qué significa * args y ** kwargs?
- 14. ¿Qué debo hacer si se lanza una IOException?
- 15. Qué hacer con una excepción detectada
- 16. ¿Cómo funciona boost :: unordered_map.emplace (Args && ... args)?
- 17. ¿Qué le pasó a Maven Polyglot?
- 18. Python + JSON, ¿qué le pasó a None?
- 19. java args like linux args
- 20. Scala: pase Seq a funciones var-args
- 21. ¿Qué pasó con VRML?
- 22. ¿Hay alguna forma de saber si --debug o --verbose se pasó a PHPUnit en una prueba?
- 23. ¿Qué significa 'args' en CliBuilder?
- 24. Mejorar __init__ donde args se asignan directamente a los miembros
- 25. ¿Qué pasó con syscalls.h?
- 26. Determinar si se pasó un parámetro con nombre
- 27. Estándares de codificación: Gran cantidad de argumentos
- 28. Llamar a una función de Python con args *, ** y kwargs opcional/por defecto argumentos
- 29. ¿Cómo hacer que el código se ejecute solo si se lanzó una excepción?
- 30. ¿Qué pasó con OmniXML?
Este es un bello ejemplo del uso de la herencia múltiple muy bien. Gracias. –