Можно ли запускать блоки с отступом, используя exec ()? - PullRequest
0 голосов
/ 13 сентября 2018

Используя команду exec() python, можно ли запускать блоки кода с отступом (например, операторы if/else или try/except).Например:

name = input("Enter name: ")
if name == "Bob":
     print("Hi bob")
else:
     print("Hi user")

В настоящее время я использую это для запуска кода:

code_list = []
while True:
     code = input("Enter code or type end: ")
     if code == "end":
          break
     else:
          code_list.append(code)
for code_piece in code_list:
     exec(code_piece)

Также я знаю, что это не очень "Pythonic" или "Good Practice"чтобы позволить пользователю вводить свой собственный код, но это будет полезно в других частях моего кода.

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

С exec () документация:

Эта функция поддерживает динамическое выполнение кода Python. Объект должен быть либо строкой, либо объектом кода. Если это строка, строка анализируется как набор операторов Python, которые затем выполняются ...

Таким образом, вы можете делать такие вещи, как

exec("a=2\nb=3")
exec("if a==2:\n\tprint(a)\nelse:\tprint(b)")

Вам просто нужно соблюдать правильный синтаксис и отступ.

0 голосов
/ 16 сентября 2018

Другим способом форматирования кода в функции exec () является использование тройных кавычек, что позволяет легко увидеть, как выглядит код.

code = """                     # Opening quotes
for i in range(0, 10):         # Code line 1         
    print(i)                   # Code line 2
"""                            # Closing quotes
exec(code)

Это может не сработать, если выпопросить пользователя ввести код, но этот прием может пригодиться.

0 голосов
/ 13 сентября 2018

Проблема здесь не в отступе. Проблема в том, что вы пытаетесь exec строки составного оператора одна за другой. Python не может иметь смысла составного утверждения без всего этого.

exec весь ввод как единое целое:

exec('\n'.join(code_list))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...