7

Jak wiadomo, jeśli po prostu zrobić:Pierwsze nazwę, która nie jest zdefiniowana z NameError w Pythonie

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

Czy istnieje sposób na złapanie wyjątku/błędu i wydobywania z niej wartość „A”. Potrzebuję tego, ponieważ jestem eval wykorzystuję niektóre dynamicznie tworzone wyrażenia i chciałbym odzyskać nazwy, które nie są w nich zdefiniowane.

Mam nadzieję, że wyraziłem się jasno. Dzięki! Manuel

+0

Jeśli nie jest zdefiniowany, h ow czy może mieć wartość? –

+1

Chcę wyodrębnić nazwę, a nie wartość. Powiedziałem "wartość" a "", a nie "wartość a". –

+1

Dlaczego musisz używać 'eval'? Jeśli chcesz utworzyć powłokę Pythona, nie jest to właściwe narzędzie. Jeśli chcesz utworzyć narzędzie do oceny ekspresji dla swojej aplikacji, nie jest to właściwe narzędzie. –

Odpowiedz

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

Jeśli nie chcesz, aby użyć wyrażenia regularnego, można zrobić coś takiego zamiast

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

można analizować ciąg wyjątków dla '' wartości wydobycia.

0

Nie import exceptions potrzebnej w Pythonie 2.x

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

przypisać odniesienie dla "a" jako takie:

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