[pyar] Detectando llamadas con cantidad incorrectas de argumentos

Matías Bellone matiasbellone en gmail.com
Vie Feb 27 18:13:36 ART 2015


2015-02-27 17:52 GMT-03:00 Daniel Moisset <dmoisset en machinalis.com>:

> Hola, estoy tratando de resolver el siguiente problema:
>
> tengo un cacho de código que saca de varios lados un callable 'f', una
> lista 'args', y un diccionario 'kwargs'
>
> Ese cacho de codigo llama a f(*args, **kwargs)
>
> Cuando eso sucede, existe la posibilidad de que las cantidades de
> argumentos no coincidan, por ejemplo que f acepte 2 argumentos, y args sea
> una lista de 100 valores. Eso me va a levantar una excepción del estilo
>
> TypeError: f() takes exactly 2 arguments (100 given)
>
> Quiero capturar ese error para poder generar mensajes de log/error
> relevantes (que dicen por ejemplo de donde salieron f, args, kwargs a un
> nivel mas relevante para el que lee logs). Lo primero que se me ocurrio es:
>
> try:
>     f(*args, **kwargs)
> except TypeError:
>     loguear(informacion_relevante)
>
> El problema es que esto me captura otros TypeErrors que no tienen nada que
> ver con llamar a la funcion con cantidad correcta de argumentos, que se
> capturan a un nivel mas alto, y quiero dejar pasar. Entonces quisiera hacer:
>
> try:
>     f(*args, **kwargs)
> except TypeError as e:
>     if <e es por un mismatch de argumentos>:
>         loguear(informacion_relevante)
>     else: raise
>
> o alguna alternativa como:
>
> if <f, args, kwargs no matchean en argumentos>:
>     loguear(informacion_relevante)
> else:
>     f(*args, **kwargs)
>
> Se les ocurre alguna forma de lograr eso?
>
>

https://docs.python.org/2/library/inspect.html#inspect.getargspec

>>> from inspect import getargspec
>>> def a(q, p, z, x=1, y=None, *args, **kwargs):
...     pass
...
>>> getargspec(a)
ArgSpec(args=['q', 'p', 'z', 'x', 'y'], varargs='args', keywords='kwargs',
defaults=(1, None))

Supongo que con eso tenés suficiente como para poder programar la lógica de
todos los argumentos que te hacen falta.

Saludos,
Toote
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20150227/b83ae457/attachment-0001.html>


More information about the pyar mailing list