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