2012年9月7日

Python で pep-8 の「E501 line too long」にしないためのコーディングテクニック

概要

Python は 「PEP 8 -- Style Guide for Python Code」というコーディング規約がある。
また、ソースコードが pep-8 に準拠しているかチェックするための「pep8 - Python style guide checker」が存在する。
Python 使いは、pep-8 に準拠したソースを記述するのが良い。

pep-8 の中で最も守られていないルールはおそらく「1行79文字制限」ではないだろうか。
pep8 - Python style guide checkerではこれに違反すると「E501 line too long」になる。

テストコード等一部で E501 になるのが仕方ない場合もあるが、通常 E501 が出るのは避けるべきだ。
E501 を避けるためのテクニックを紹介する。

テクニックのポイント

Pythonが丸括弧「()」で囲んだ範囲を纒まりとして認識することを利用する。

長い文字列の改行

URLなどは長い文字列になりがちだ。

sample = 'http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?prec_no=44&block_no=47662&year=2012&month=8&day=&view='

長い文字列は以下のようにすれば改行できる。

sample = ('http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?'
          'prec_no=44&block_no=47662&year=2012&month=8&day=&view=')

Python は「()」で囲んだ中は一つの連続として取り扱い、かつ「()」内で連続した文字列を自動で結合する。
この場合「+」演算子で結合したり、「format」や「%s」を利用する必要はない。

以下は極端に改行した例だ。

sample = ('http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?'
          'prec_no=44&'
          'block_no=47662&'
          'year=2012&'
          'month=8&'
          'day=&view=')

当然改行しても、format や %s 等は正常に動作する。

%s を利用した例。

sample = ('http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?'
          'prec_no=%s&block_no=%s&year=%s&month=8&day=&view='
          % (44, 47662, 2012))

format を利用した例。

sample = ('http://www.data.jma.go.jp/obd/stats/etrn/view/daily_s1.php?'
          'prec_no={}&block_no={}&year={}&month=8&day=&view='
          .format(44, 47662, 2012))

これで横 79文字制限を避けることができる。

複数 import 文の改行

import 文に「*」を使わないようにすると、複数の import 文だと横に長くなる場合がある。

from mongoengine import BooleanField, DecimalField, DateTimeField, EmbeddedDocumentField, StringField

文字列の場合と同様「()」を利用することで、改行が可能だ。

from mongoengine import (
    BooleanField,
    DecimalField,
    DateTimeField,
    EmbeddedDocumentField,
    StringField,
)

メソッド呼びだしなどが長い場合の改行

メソッドの中でメソッドを呼び出すと、横に長くなる傾向がある。

sample_function(foo_function(bar_function('test')))

以下のように改行できる。

sample_function(
    foo_function(
        bar_function('test')))

ただ、このようなコーディングは本来は避けた方が良いだろう。

1行79文字を越えるのは設計かコーディングが変だと考えること

文字列やimport文以外で、1行79文字を越えなければいけないのは完全にコーディングがおかしい。
引数が多すぎるメソッドやメソッドの中でメソッドの呼び出しはオブジェクト指向を理解しているとは言いがたいコーディングである。
1行79文字を越えた場合、おかしい、と考えるべき。

結論

pep-8 は非常に良く考えられたコーディング規約だ。完全準拠したコーディングを愚直に実施してみると、その真の意味が理解できるようになるだろう。

blog comments powered by Disqus