给定一个s
包含(语法上有效的)Python 源代码的字符串,我怎样才能拆分s
成一个数组,其元素是对应于 Python 中的“语句”的字符串s
?
我在“陈述”周围加上了吓人的引号,因为这个术语并没有准确地捕捉到我正在寻找的东西。与其试图提出更准确的措辞,不如举一个例子。比较以下两个 ipython 交互:
In [1]: if 1 > 0:
......: pass
......:
In [2]: if 1 > 0
File "<ipython-input-1082-0b411f095922>", line 1
if 1 > 0
^
SyntaxError: invalid syntax
在第一次交互中,在第一个[RETURN]
语句之后,ipython 会if 1 > 0:
毫无异议地处理输入,即使它仍然不完整(即它不是完整的 Python 语句)。相比之下,在第二次交互中,输入不仅不完整(在这个意义上),而且 ipython 也不能接受。
作为第二个更完整的示例,假设该文件foo.py
包含以下 Python 源代码:
def print_vertically(s):
'''A pretty useless procedure.
Prints the characters in its argument one per line.
'''
for c in s:
print c
greeting = ('hello '
'world'.
upper())
print_vertically(greeting)
现在,如果我运行以下片段,具有所需的split_python_source
功能:
src = open('foo.py').read()
for i, s in enumerate(split_python_source(src)):
print '%d. >>>%s<<<' % (i, s)
输出如下所示:
0. >>>def print_vertically(s):<<<
1. >>> '''A pretty useless procedure.
Prints the characters in its argument one per line.
'''<<<
2. >>> for c in s:<<<
3. >>> print c<<<
4. >>>greeting = ('hello '
'world'.
upper())<<<
5. >>>print_vertically(greeting)<<<
如您所见,在这种拆分中,for c in s:
(例如)被分配给它自己的项目,而不是成为某些“复合语句”的一部分。
事实上,我没有关于如何进行拆分的非常精确的规范,只要它是“在关节处”完成的(就像 ipython 那样)。