Я хотел бы иметь возможность оценивать произвольный код из строки в Python, включая код, состоящий из нескольких операторов, и операторов, которые охватывают несколько строк. Подходы, которые я пробовал до сих пор, заключались в использовании exec
и eval
, но они, по-видимому, способны оценивать выражения. Я также пробовал класс code.InteractiveInterpreter, но это, по-видимому, позволяет оценивать с помощью eval
, exec
или single- режимы выписки. Я пробовал разбивать код за строкой, но это не справляется с операторами, которые охватывают несколько строк. Есть ли способ сделать это?
exec
похоже на то, что вы ищете:
s = """
for i in range(5):
print(i)
"""
exec s
печатает
0
1
2
3
4
eval()
обрабатывает только выражения, но exec
обрабатывает произвольный код.
Можете ли вы рассказать мне о проблеме, с которой вы столкнулись с помощью exec
? Кажется, это работает для меня.
>>> foo = """
... def baz():
... print "Hello"
... """
>>>
>>> exec foo
>>> baz()
Hello
>>>
exec
также имеет форму in
, где вы можете вставить результат оценки в пространство имен, которое лучше, чем загрязнение текущего.
Просто чтобы понять, что говорит sven, есть условная часть использования exec, которая позволяет выполнять спецификацию пространства имен внутри, например, когда exec exec в глобальном пространстве имен вы можете делать
exec "code" in globals()
или если вы хотите указать свое собственное пространство пространства имен, это будет dict
di = {}
exec "code" in di