(構文的に有効な) Python ソース コードを含む文字列が与えられた場合、要素が Python の "ステートメント" に対応する文字列である配列s
に分割するにはどうすればよいですか?s
s
この用語は私が探しているものを正確に捉えていないため、「ステートメント」の周りに怖い引用符を付けます. より正確な言葉遣いを考え出すのではなく、ここに例を示します。次の 2 つの 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 ステートメントではありません)、反対することなく入力を処理します。対照的に、2 番目の対話では、入力は (この意味で) 不完全であるだけでなく、ipython にも受け入れられません。
2 番目のより完全な例として、ファイル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のように)分割が行われる限り、分割の方法について正確な仕様はありません。