PythonからUSBミサイルランチャを操作する短いサンプル [Main] Python2.4以降での高速なソート

PythonからUSBミサイルランチャを操作する短いサンプル[Python(18)]Python2.4以降での高速なソート

Pythonで日本語PDFをつくる短いサンプル[TIPS(3)]Python2.4以降での高速なソート

Re: Python で改行を含む長い文字列をスマートに記述する

Python で改行を含む長い文字列をスマートに記述する ― TRIVIAL TECHNOLOGIES 2.0を読んで、 ちょっとした関数"multiline"を作ってみました。

下のコードを実行するとその下のように出力されます。

>>> multiline("""
[foo]
  [bar]
    [baz]
      hoge
    [/baz]
  [/bar]
[/foo]
""")
'\n'.join([
    '[foo]',
    '  [bar]',
    '    [baz]',
    '      hoge',
    '    [/baz]',
    '  [/bar]',
    '[/foo]',])

逆に、この出力の前にprintとつけて実行すると元に戻ります。

>>> print '\n'.join([
    '[foo]',
    '  [bar]',
    '    [baz]',
    '      hoge',
    '    [/baz]',
    '  [/bar]',
    '[/foo]',])
[foo]
  [bar]
    [baz]
      hoge
    [/baz]
  [/bar]
[/foo]

ソースは以下のようになります。たいしたことはしてません。

def multiline(s):
    s = s.strip("\n")
    print ("'\\n'.join([\n" +
            "\n".join("    %s," % `x`
                      for x in s.split("\n")) +
           "])")

個人的には全ての行末に\nがつくのと、 頭に"\n".joinがつくのでは後者の方がマシだと思っているのですが、 そうでない人には下のコードの方がいいかもしれません。

>>> def multiline(s):
    s = s.strip("\n")
    print "\n".join(
	    r"    %s\n'" % `x`[:-1]
	    for x in s.split("\n"))
これだと下のように出力されます。 Pythonでは隣接する文字列リテラルが結合されるので この複数行の状態のまま普通に使って問題なく動きます。
    
>>> multiline("""
[foo]
  [bar]
    [baz]
      hoge
    [/baz]
  [/bar]
[/foo]
""")
    '[foo]\n'
    '  [bar]\n'
    '    [baz]\n'
    '      hoge\n'
    '    [/baz]\n'
    '  [/bar]\n'
    '[/foo]\n'

最後になりましたが、 4.8 textwrap -- テキストの折り返しと詰め込みのdedentを使うというのも一つの手ですね。