Python 1 行が 79 文字以内である理由と 1 行を最大 79 文字以内に抑える方法

1 行が 79 文字以内である理由

1. エディタに勝手に改行させないため。

コードレビューする際に、エディタで勝手に改行されると読みづらくなるので。

この 1 行の文字数の制限は、1 行が 80 文字のエディタが折り返して表示する機能を避けるために選定されたものである。
Maximum Line Length | PEP 8 -- Style Guide for Python Code


ちなみにこの 80 という数字はパンチカードから来ているのでは、という話を聞いたことがあります。

1928年、IBMは縦長の長方形の穴を採用し、80欄で各欄に12のパンチ位置があり、1欄(コラム)で1文字を表す形式のカードを設計した[23]。
パンチカード | Wikipedia


PEP 8, Limit all lines to a maximum of 79 characters. の抜粋、和訳です。

PEP 8: Python コードのためのスタイルガイド
Maximum Line Length | PEP 8 -- Style Guide for Python Code

すべての行を最大 79 文字に制限する。
Limit all lines to a maximum of 79 characters.

コードの後に続く docstring やコメントのような構造的な制限の少ない長いブロックのテキストについては、1 行の長さは 72 字以内にするべきだ。
For flowing long blocks of text with fewer structural restrictions (docstrings or comments), the line length should be limited to 72 characters.

エディタのウィンドウを表示する際に必要な幅を制限できれば、複数のファイルを並べることが可能になり、2 つのバージョンのコードを隣接して左右に並べて、コードリビューツールを使うときに効果的である。
Limiting the required editor window width makes it possible to have several files open side-by-side, and works well when using code review tools that present the two versions in adjacent columns.

大抵のツールが提供する、デフォルトで長い 1 行を折り返して表示してくれる機能(wrapping)は、コードの見た目の構造を破壊し、より理解を困難なものにする。
The default wrapping in most tools disrupts the visual structure of the code, making it more difficult to understand.

この 1 行の文字数の制限は、1 行が 80 文字のエディタが折り返して表示する機能を避けるために選定されたものである。もし、たとえツールが目印として 1 行の文字を複数行で折り返し表示したときに、最後の文字に印を置いてくれるような機能がったとしても勝手に折り返されるのを避けるために1行を 79 文字に制限するべきである。
The limits are chosen to avoid wrapping in editors with the window width set to 80, even if the tool places a marker glyph in the final column when wrapping lines.

いくつかのウェブベースのツールは、自動的に行を折り返してくれるようなことは、全くしてくれないかもしれない。
Some web based tools may not offer dynamic line wrapping at all.

Markdown の改行について

全く話がそれますが Markdown では改行は、システムに任せると言う考えなので、それとは真逆ですね。個人的には改行はすごく読みやすさに影響するので Markdown よりは Python 的な方がやりやすいのですが..。

PARAGRAPHS AND LINE BREAKS | Markdown: Syntax

段落は単純に1つまたはそれ以上の連続した行の文章で、段落は1つまたはそれ以上の空白で分けれらています。(空白の行とは、空白の行ように見える行、全てを指します。ー空白またはタブを除く何も含まない行は、空白とみなされます。)通常のパラグラフは、空白またはタブでインデントされてはいけません。
A paragraph is simply one or more consecutive lines of text, separated by one or more blank lines. (A blank line is any line that looks like a blank line — a line containing nothing but spaces or tabs is considered blank.) Normal paragraphs should not be indented with spaces or tabs.

「1つまたは2つ以上の連続した文章の行」と言うルールの意味合いを、 Markdown では「強制的に改行された」文章の段落として捉えています。これはほとんどの text ファイルから HTML ファイルへの書式整形を行うツールと大きく異なります。(Movale Type の “Convert Line Breaks” オプションも含めて)ほとんどの書式ツールというのは、段落内の全ての改行文字を <br /> tag に変換します。
The implication of the “one or more consecutive lines of text” rule is that Markdown supports “hard-wrapped” text paragraphs. This differs significantly from most other text-to-HTML formatters (including Movable Type’s “Convert Line Breaks” option) which translate every line break character in a paragraph into a <br /> tag.

あなたが Markdown を使用していて <br /> tag を挿入したいときは、行を2つまたはそれ以上の半角スペースを入力した後に改行を入力してください。
When you do want to insert a <br /> break tag using Markdown, you end a line with two or more spaces, then type return.

もちろん、<br /> を生成させるために、このようにして空白を2文字以上いれることは手間となります。しかし、単純に「全ての改行は <br /> だという。」という考えは、 Markdown ではうまく行きません。Markdown の email 形式の blockquoting と multi-paragraph list items なら、うまく書式整形されて見栄えも良いです ー 行末に達すると強制的に改行される機能(hard breaks)を使って書式整形を行うときは(訳注: 具体的にどういう時にうまく行くのかわからない..)。
Yes, this takes a tad more effort to create a <br />, but a simplistic “every line break is a <br />” rule wouldn’t work for Markdown. Markdown’s email-style blockquoting and multi-paragraph list items work best — and look better — when you format them with hard breaks.

2. 抽象化することを前提にしているため

Python には iterator, descriptor など、コードを抽象化できる様々な機能があります。これらの機能を使うことにより、比較的短く書くことできたりする場合あったりします。

1 行を最大 79 文字以内に抑える方法

1 行 79 文字と言う制限が、実は結構重くて最初は無視するような設定にしようかと思っていたのですが、最近は遵守しています。いくつか回避方法があります。

1. バックスラッシュ \ を使う。

def eq(rectangle_a, rectangle_b):
    """2つの長方形が同じかどうかを確認する関数"""
    return \
        rectangle_a.x1 == rectangle_b.x1 and \
        rectangle_a.y1 == rectangle_b.y1 and \
        rectangle_a.x2 == rectangle_b.x2 and \
        rectangle_a.y2 == rectangle_b.y2

2. 括弧 ( ) を使う

括弧内なら改行が許容されます。
line too longの対処法(メソッドが連続する場合)


こんな書き方ができるんや..

# 1. str として格納される。tuple に格納される訳ではない。
# 2. + 演算子はいらない。
allowed_chars= ('abcdefghijklmnopqrstuvwxyz'
                'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789')

Python で pep-8 の「E501 line too long」にしないための...

3. 変数を分ける

個人的にはこんな感じで別の変数に一旦格納して2行に分けたりもします。これはこれで変数が増えてしまうのですが..。

# 前
supplier = Supplier.objects.filter(category=supplier_category).order_by('phonetic')

# 後
supplier = Supplier.objects.filter(category=supplier_category)
supplier_ordered_by_phonetic = supplier.order_by('phonetic')

4. 抽象化の度合いあげる。

例えば、イテレータを使って短くすることができます。

>>> for member in team.member_list:
...     print(member)
川島 永嗣
香川 真司
長谷部 誠 
>>>
>>> for member in team:
...     print(member)
川島 永嗣
香川 真司
長谷部 誠 
>>>

Python のイテレータ

5. 変数名を短くしちゃう?

79 文字に抑えるために、変数名を短くすることについては、人によって意見は別れるような感じに受けます。

個人的には短くすることは、抵抗があります。自分は、長い変数名と文字数を 79 文字を両方とも許容して、 バックスラッシュ \ や括弧 ( ) を使って対応しています。

なぜなら Python は、はじめてコードを読むときに型がわからないので、その変数が何を表しているかを明確にする必要性が静的言語のそれ以上にあると感じているからです。