Как оценить произвольный код в Python?

1

Я хотел бы иметь возможность оценивать произвольный код из строки в Python, включая код, состоящий из нескольких операторов, и операторов, которые охватывают несколько строк. Подходы, которые я пробовал до сих пор, заключались в использовании exec и eval, но они, по-видимому, способны оценивать выражения. Я также пробовал класс code.InteractiveInterpreter, но это, по-видимому, позволяет оценивать с помощью eval, exec или single- режимы выписки. Я пробовал разбивать код за строкой, но это не справляется с операторами, которые охватывают несколько строк. Есть ли способ сделать это?

  • 1
    Нет, ты не хочешь этого. Потому что это совершенно не нужно, небезопасно, добавляет много головной боли и грязно в любом случае.
  • 1
    @delnan: Он не сказал, над чем работает. Там нет никакого вреда в предупреждении об этом, но, может быть, он действительно этого хочет?
Показать ещё 2 комментария
Теги:

3 ответа

3
Лучший ответ

exec похоже на то, что вы ищете:

s = """
for i in range(5):
    print(i)
"""
exec s

печатает

0
1
2
3
4

eval() обрабатывает только выражения, но exec обрабатывает произвольный код.

  • 0
    Да, похоже, вы правы, похоже, я ошибся насчет exec. Спасибо!
3

Можете ли вы рассказать мне о проблеме, с которой вы столкнулись с помощью exec? Кажется, это работает для меня.

>>> foo = """
... def baz():
...   print "Hello"
... """
>>> 
>>> exec foo
>>> baz()
Hello
>>> 

exec также имеет форму in, где вы можете вставить результат оценки в пространство имен, которое лучше, чем загрязнение текущего.

1

Просто чтобы понять, что говорит sven, есть условная часть использования exec, которая позволяет выполнять спецификацию пространства имен внутри, например, когда exec exec в глобальном пространстве имен вы можете делать

exec "code" in globals()

или если вы хотите указать свое собственное пространство пространства имен, это будет dict

di = {}
exec "code" in di

Ещё вопросы

Сообщество Overcoder
Наверх
Меню