Гарантирует ли отсутствие отступов контекст верхнего уровня в Python?

Я работаю над синтаксическим анализатором сценариев, который расширяет встроенный код Python в код сценария, извлекая весь код Python в один файл, чтобы он мог запомнить переменные Python, определенные ранее в сценарии. Поэтому, чтобы заменить вывод Python в соответствующих местах в скрипте, он заботится как о выводе Python, так и о номере строки, создавшей этот вывод. Итак, я хотел бы сгенерировать код Python следующим образом:

sys.stdout = ... # Write function reads _lineNumber and includes it in the output
_lineNumber = 1 # this line automatically inserted
print("qwerty") # from line 1
_lineNumber = 2 # this line automatically inserted
def foobar(x):
    print(x)
_lineNumber = 4
if True:
    foobar("fdsa") # from line 4
_lineNumber = 6
foobar("asdf") # from line 6

Однако обратите внимание, что я должен пропустить строки 3 и 5, потому что они не находятся в контексте верхнего уровня - изменение _lineNumber во время вызова функции будет некорректным поведением, а изменение _lineNumber во время if потребует соответствия отступа и будет излишне сложным, когда Я могу просто потребовать, чтобы пользователь завершил все блоки кода, такие как функции и условия, в одном и том же блоке кода скрипта. Моя проблема заключается в том, чтобы всегда выполнять присваивание _lineNumber всегда допустимо - строки между присваиваниями являются произвольным кодом. Мой вопрос: если следующая строка не имеет отступа, гарантирует ли это, что синтаксически допустимо вставлять присваивание _lineNumber в предыдущей строке, или есть какая-либо другая грамматика python, которая создала бы схему вставки присваивания перед каждым неиспользуемым строка будет недействительной?

1 ответ

Решение

Нет; хотя отступ в начале строки может рассказать вам о глубине контекста этого оператора, для многих вещей, таких как списки, все еще возможно заставить одну строку занимать несколько строк кода, а другие операторы, такие как else может быть связано с более ранними утверждениями, несмотря на отсутствие отступа. Там нет простого способа сделать это; Если не считать разбора на python, вам придется полагаться на пользователя, чтобы вернуться к контексту верхнего уровня в четко определенных точках.

Другие вопросы по тегам