缺少缩进是否保证 Python 中的顶级上下文?
Does a lack of indentation guarantee a top-level context in 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 是不正确的行为,而在 if 期间更改 _lineNumber 需要匹配缩进当我可以简单地要求用户在同一脚本代码块中完成所有代码块(例如函数和条件)时,这就变得不必要地复杂了。我的问题是确保在我执行对 _lineNumber 的赋值时始终有效——赋值之间的行是任意代码。我的问题是,如果下一行没有缩进,这是否保证在前一行插入对 _lineNumber 的赋值在语法上是有效的,或者是否有任何其他 python 语法可以使插入的方案成为可能每个未缩进行之前的赋值无效?
没有;虽然行首的缩进可以告诉您该语句的上下文深度,但对于许多事情(例如列表)仍然可能导致一行跨越多个代码行,以及其他语句(例如 else
尽管没有缩进,也可以连接到前面的语句。没有简单的方法可以做到这一点;除了进入 python 解析之外,您还必须依靠用户 return 到定义明确的点的顶级上下文。
我正在开发一个脚本解析器,它通过将所有 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 的赋值在语法上是有效的,或者是否有任何其他 python 语法可以使插入的方案成为可能每个未缩进行之前的赋值无效?
没有;虽然行首的缩进可以告诉您该语句的上下文深度,但对于许多事情(例如列表)仍然可能导致一行跨越多个代码行,以及其他语句(例如 else
尽管没有缩进,也可以连接到前面的语句。没有简单的方法可以做到这一点;除了进入 python 解析之外,您还必须依靠用户 return 到定义明确的点的顶级上下文。