Python: как определить, является ли строка выражением или выражением? - PullRequest
4 голосов
/ 06 октября 2010

Мне нужно либо вызвать exec () или eval () на основе входной строки "s"

Если "s" было выражением, после вызова eval () я хочу напечатать результат, еслирезультат не был None

Если "s" было оператором, то просто exec ().Если это утверждение что-то печатает, то пусть будет так.

s = "1 == 2" # user input
# ---
try:
    v = eval(s)
    print "v->", v
except:
    print "eval failed!"
# ---
try:
    exec(s)
except:
    print "exec failed!"

Например, "s" может быть:

s = "print 123"

И в этом случае следует использовать exec ().

Конечно, я не хочу пробовать сначала eval (), и если это не удастся, вызовите exec ()

Ответы [ 2 ]

10 голосов
/ 06 октября 2010

Попробуйте compile как выражение.Если это не удается, то это должен быть оператор (или просто недействительный).

isstatement= False
try:
    code= compile(s, '<stdin>', 'eval')
except SyntaxError:
    isstatement= True
    code= compile(s, '<stdin>', 'exec')

result= None
if isstatement:
    exec s
else:
    result= eval(s)

if result is not None:
    print result
6 голосов
/ 06 октября 2010

Звучит так, будто вы хотите, чтобы пользователь мог взаимодействовать с интерпретатором Python из вашего скрипта. Python делает это возможным через вызов code.interact:

import code    
x=3
code.interact(local=locals())
print(x)

Запуск скрипта:

>>> 1==2
False
>>> print 123
123

Интерпретатору известны локальные переменные, установленные в скрипте:

>>> x
3

Пользователь также может изменить значение локальных переменных:

>>> x=4

Нажатие Ctrl-d возвращает управление скрипту.

>>> 
4        <-- The value of x has been changed.
...