7

Como saben, si simplemente hacemos:Obtener el nombre que no se define a partir NameError en Python

>>> a > 0 
Traceback (most recent call last): 
    File "<pyshell#1>", line 1, in <module> 
    a > 0 
NameError: name 'a' is not defined 

¿Hay una manera de capturar la excepción/error y extraer de ella el valor 'a'. Lo necesito porque estoy eval pulsando algunas expresiones creadas dinámicamente, y me gustaría recuperar los nombres que no están definidos en ellas.

Espero haber sido claro. Gracias! Manuel

+0

Si no está definido, h ¿Cómo puede tener un valor? –

+1

Quiero extraer el nombre, no el valor. Dije "el valor 'a'", no "el valor de a". –

+1

¿Por qué necesita usar 'eval'? Si desea crear un shell de Python, esta no es la herramienta adecuada. Si desea crear un evaluador de expresiones para su aplicación, esta no es la herramienta adecuada. –

Respuesta

6
>>> import re 
>>> try: 
...  a>0 
... except (NameError,),e: 
...  print re.findall("name '(\w+)' is not defined",str(e))[0] 
a 

Si no desea utilizar expresiones regulares, que podría hacer algo como esto en su lugar

>>> str(e).split("'")[1] 
'a' 
1
>>> import exceptions 
>>> try: 
...  a > 0 
... except exceptions.NameError, e: 
...  print e 
... 
name 'a' is not defined 
>>> 

Puede analizar la cadena de excepciones para '' valor a extraer.

0

Sin import exceptions necesaria en Python 2.x

>>> try: 
...  a > 0 
... except NameError as e: 
...  print e.message.split("'")[1] 
... 
a 
>>> 

Se asigna la referencia para 'a' como tal:

>>> try: 
...  a > 0 
... except NameError as e: 
...  locals()[e.message.split("'")[1]] = 0 
... 
>>> a 
0 
Cuestiones relacionadas