16:utils.pyのような汎用的な名前を避ける

Pythonのモジュール(Pythonファイル)を分割するとき、とりあえずで utils.py という名前にしていませんか?

具体的な失敗

以下のような関数をすべて utils.py にまとめるのはやめましょう。

リスト 1.2 utils.py
from datetime import timedelta
from urllib.parse import urlencode

from payment.models import Purchase


def get_purchase(purchase_id):
    return Purchase.objects.filter(published_at__isnull=False).get(id=purchase_id)


def takeover_query(get_params, names):
    return urlencode({k: v for k, v in get_params.items() if k in names})


def date_range(start, end, step=1):
    current = start
    while current <= end:
        yield current
        current += timedelta(days=step)

utils.py というモジュール名はなるべく使わないのが良いでしょう。 ビジネス上の仕様に深く関わる処理や、データの仕様などに関係する処理を、「ユーティリティ」というモジュールにまとめるのは不適切です。 ユーティリティには「有益なもの」「便利なもの」くらいのニュアンスしかありません。

ベストプラクティス

まずデータをフィルターする処理は models.py などにまとめるのが良いです。 Djangoフレームワークを使う場合はQuerySetのメソッドに実装できます。

リスト 1.3 models.py
from django.db import models


class PurchaseQuerySet(models.QuerySet):
    def filter_published(self):
        return self.filter(published_at__isnull=False)


class Purchase(models.Model):
    ...
    objects = PurchaseQuerySet.as_manager()

また、「リクエスト」に関係する処理であれば、 request.py など別のモジュールを作るのが良いでしょう。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください