Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缩进的缺乏是否保证了Python中的顶级上下文?_Python_Syntax_Indentation_Line Numbers_Embedded Script - Fatal编程技术网

缩进的缺乏是否保证了Python中的顶级上下文?

缩进的缺乏是否保证了Python中的顶级上下文?,python,syntax,indentation,line-numbers,embedded-script,Python,Syntax,Indentation,Line Numbers,Embedded Script,我正在开发一个脚本解析器,它通过将所有Python代码提取到一个文件中,将嵌入式Python代码扩展为脚本代码,这样它就可以记住脚本中前面定义的Python变量。因此,为了在脚本中的适当位置替换Python输出,它同时关心Python的输出和生成此输出的行号。因此,我想生成如下Python代码: sys.stdout = ... # Write function reads _lineNumber and includes it in the output _lineNumber = 1 # t

我正在开发一个脚本解析器,它通过将所有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解析之外,您还必须依靠用户在定义良好的点返回顶级上下文。

为什么不重写
print
调用以包含行号参数,或者使用
inspect.stack()
并从调用方的堆栈框架中拉出行号?另外,
sys.stdout.write
可能不是将行号添加到输出中的好地方,如果您将此文件从嵌入到其他内容中的一组代码段组合在一起,行号可能没有那么有用。@user2357112本质上,行号告诉我输出来自哪个代码段,这样我就可以把输出放在那个片段的位置上。在print中添加参数将强制用户执行冗余。实际的行号没有那么重要;只是片段和输出之间的对应关系。添加此信息的最佳位置是
sys.stdout.write
?不,我的意思是,为什么不重写
print
调用以包含行号?解析工作太复杂了?另外,如果行号应该指示特定输出位来自哪个代码段,那么它是行号还是代码段号?如果它是一个代码段编号,则可以消除许多有问题的情况,如行连续体和多行字符串文字,它们都不应跨代码段。@user2357112我不想重写打印调用,因为它们可能通过任何方式调用打印,包括调用另一个函数,我想得到函数的顶级调用方的号码,而不是被调用函数的号码。它实际上是一个片段编号;然而,大多数代码段只有一行——代码段之间的行延续可能会交叉。(并非所有代码段都会输出一个值)。这不会减少它。您仍然需要处理像连续行上的
foo=[
1、
2
]
之类的内容,以及多行字符串文本,并且不要在
else
except
、或
最后
之前注入赋值。
ast
模块对于处理解析几乎是强制性的。