2

私は、大量の Python ソース コードをタイプセットする必要があるラテックス ドキュメントに取り組んでいます。私はpygments (オンライン デモではなく python モジュール) を使用して、この python をラテックスでカプセル化しています。これらの行を手動でラップすることもできますが、これは私にとってエレガントなソリューションではないように思われます。反復的なタスクよりも、クレイジーな自動化されたソリューションについて頭を悩ませることに時間を費やすことを好みます。

私が望むのは、Pythonソースコードを処理して、機能を維持しながら行を特定の最大文字長に折り返す方法です。私はいくつかのpythonをいじりましたが、最も近いのは\\\n、行の最大長の前に最後の空白を挿入することです-しかし、もちろん、これが文字列やコメントになってしまうと、うまくいきません. 率直に言って、この問題にどのようにアプローチすればよいかわかりません。

それで、行が特定の長さを超えないようにソースコードを処理できるモジュールまたはツール、または少なくともそのようなコーディングを開始するための良い方法を知っている人はいますか?

4

3 に答える 3

3

現在のアプローチを少し拡張することもできますが、標準ライブラリのtokenizeモジュールを使用して、改行を配置する場所を決定します。そうすれば、空白で区切られた単語だけでなく、ソースコードの実際のトークン(COMMENT、STRINGなど)を確認できます。

これがtokenizeができることの短い例です:

>>> from cStringIO import StringIO
>>> from tokenize import tokenize
>>> 
>>> python_code = '''
... def foo(): # This is a comment
...     print 'foo'
... '''
>>> 
>>> fp = StringIO(python_code)
>>> 
>>> tokenize(fp.readline)
1,0-1,1:    NL  '\n'
2,0-2,3:    NAME    'def'
2,4-2,7:    NAME    'foo'
2,7-2,8:    OP  '('
2,8-2,9:    OP  ')'
2,9-2,10:   OP  ':'
2,11-2,30:  COMMENT '# This is a comment'
2,30-2,31:  NEWLINE '\n'
3,0-3,4:    INDENT  '    '
3,4-3,9:    NAME    'print'
3,10-3,15:  STRING  "'foo'"
3,15-3,16:  NEWLINE '\n'
4,0-4,0:    DEDENT  ''
4,0-4,0:    ENDMARKER   ''
于 2009-06-24T00:15:28.877 に答える