0

我正在开发一个脚本解析器,它通过将所有 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 将是不正确的行为,并且在 if 期间更改 _lineNumber 需要匹配缩进并且在我可以简单地要求用户在同一个脚本代码块中完成所有代码块,例如函数和条件。我的问题是确保执行对 _lineNumber 的分配总是有效的——分配之间的行是任意代码。我的问题是,如果下一行没有缩进,这是否保证在上一行插入对 _lineNumber 的赋值在语法上是有效的,

4

1 回答 1

0

不; 虽然行首的缩进可以告诉您该语句的上下文深度,但对于许多事物(例如列表)仍然可能导致一行跨越多个代码行,而其他语句(例如else可以连接到更早)尽管没有缩进的声明。没有简单的方法可以做到这一点。如果没有进入 python 解析,您必须依靠用户在定义明确的点返回顶级上下文。

于 2015-12-15T18:50:40.540 回答