PEP8について

PEP8はPythonが目指している「誰が書いても可読性の高いソースコードにする」という崇高な目的のために非常に有意義なものですが、これじゃまだ足りていないように思います。「こういう場合ってどう書けばいいの?」という純粋な疑問があるので、皆さんに考えてもらうための問題提起として思いのままに書いてみることにします。(問題提起なら他に投げるべきところがあるだろう、というツッコミは無しでお願いします。)


■ コロンの後のスペースの有無について

PEP8のサンプルコードはこのようになっています。

d = {
    1: 'foo',
    2: 'bar',
    3: 'baz',
}

でも私はこう書きたいのです。

d = {
    1:'foo',
    2:'bar',
    3:'baz',
}

なぜならリストをスライスする時はコロンの後にスペースを入れない方が美しいからです。

a = range(10)
print a[3:]  # 最初の3つを捨てる
print a[:-5]  # 後ろの5つを捨てる
print a[::-1]  # reverseさせる

コロンの後にスペースを入れてしまうと…

a = range(10)
print a[3: ]  # 最初の3つを捨てる
print a[: -5]  # 後ろの5つを捨てる
print a[: : -1]  # reverseさせる

という具合にスカスカな感じになってしまい、なんとなく間が抜けた感じに見えてしまう気がするのです。

それぞれケースバイケースとして決めるということになればそれはそれでいいのですが、一貫性があった方が美しいと思うので「コロンの後にはスペースを入れない」というのが良いなぁと考えています。


■ tupleやリストの途中で改行した場合の書き始め位置について

例えばこんな関数があったとします。

def my_original_special_longname_function(*args, **kwargs):
    for x in args:
        print x
    for k, v in kwargs.items():
        print '%s = [%s]' % (k, v)

これを呼び出す以下のコードはどちらが美しいでしょうか?

my_original_special_longname_function(1, 2, 3, 'ダー',
                                     konomichiwo='yukeba',
                                     dounaru='monoka',
                                     )
my_original_special_longname_function(
    1, 2, 3, 'ダー',
    konomichiwo='yukeba',
    dounaru='monoka',
)

私は後者の書き方をしていて、PEP8のサンプルでは前者のサンプルコードが載せられています。個人的には圧倒的に後者の方が美しいと思うのです。PEP8に定められている「1行は79文字以内」というのも、前者だと守りづらくなってしまうような気がします。特にDjangoのモデルに対してfilterやらexcludeやらを呼ぶ場合、後者の方がスッキリ書けると思うのです。


■ スペースだけが存在する行の有無について

これは使っているエディタに大きく依存するかもしれませんが、スペースだけからなる行が存在しても良いか、悪いか。私は空白文字を可視化させているので、混在させているコードを見ると吐き気をもよおしてしまいます。

def hoge():
    for i in xrange(5):
        print i
    
    print 'done'
def hoge():
    for i in xrange(5):
        print i

    print 'done'

おわかりいただけただろうか…。print 'done' の直前の行に半角スペースがあるかないか、という違いです。私は半角スペースを入れるように(前者)コーディングしていますが、非Windows環境でコーディングしている方はスペース無し(後者)になりがちな気がします。無い方が一意のコードになるので無い方が良いような気がしていますが、のちのち空行の部分にコードを追加して

def hoge():
    for i in xrange(5):
        print i
    print 'ドゥーン!…じゃなくて',
    print 'done'

というコードにする場合、スペースがあった方がやりやすいかなぁ、という思いがあります。


もしこの記事を読まれた稀有なPythonistaがいらっしゃいましたら、是非是非ご意見・ごツッコミなどいただけるとありがたいです。