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を使うというのも一つの手ですね。