1

(構文的に有効な) Python ソース コードを含む文字列が与えられた場合、要素が Python の "ステートメント" に対応する文字列である配列sに分割するにはどうすればよいですか?ss

この用語は私が探しているものを正確に捉えていないため、「ステートメント」の周りに怖い引用符を付けます. より正確な言葉遣いを考え出すのではなく、ここに例を示します。次の 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のように)分割が行われる限り、分割の方法について正確な仕様はありません。

4

1 に答える 1

-1

私は Python lexer の内部構造に精通していません (ただし、SO の多くの人はそうであることはほぼ確実です :) が、私の推測では、基本的に行を探しているのでしょう。複数行。

()手早く汚い最初のパスとして、コードの一部を改行で分割するものから始めて、ペアの区切り文字 (括弧、ブレース{}、ブラケット[]、および引用符)を含むことが判明した連続する行をマージすることができます''''' '''頭に浮かぶものです。

于 2013-08-14T23:17:31.110 に答える