つくる ファイル分割

このレッスンでできるようになること。家計簿を data.py と report.py と呼び出し側の3つに、責務で分けられるようになります。新しい文法は出てきません。第1章で覚えた道具だけで1本組み上げます。

なぜ分けるのか

入門で作った家計簿は1つのファイルにデータも計算も表示も全部入っていました。行数が増えると、直したい処理を探すだけで時間がかかります。役割ごとにファイルを分けておくと、修正したい場所が名前で分かります。

分け方の定番は次のとおりです。

  • data.py はデータを持つ。支出の一覧そのもの
  • report.py は計算と整形をする。合計、カテゴリ別集計、1行の書式
  • 呼び出し側は流れだけを書く。どのデータをどう出すかの手順

依存の向きを一方通行にする

分けるときに大事なのは、矢印の向きを揃えることです。呼び出し側は datareport を読み込みますが、reportdata を読み込みません。report.total(expenses) のように、集計したいリストを引数で受け取る形にしておくと、report.py はどんなデータにも使い回せます。逆に report.py の中で data.EXPENSES を直接読んでしまうと、そのデータ専用の道具になってしまいます。

今回の出力

明細を4行、合計を1行、カテゴリ別を3行の順に出します。日付は %m/%d08/01 の形に揃え、カテゴリ別は最初に登場した順で出します。Python の辞書は入れた順を覚えているので、ふつうに for で回せばその順に出ます。

演習ではファイルを文字列として書き出してから読み込みますが、実務ではエディタで3つのファイルを作るだけです。分け方の考え方は同じです。

要件

  1. data.py に EXPENSES を、report.py に format_line / total / by_category を書き出すこと
  2. report.py の関数は引数で支出リストを受け取り、data を読み込まないこと
  3. 明細4行のあとに 合計 2850円 を出し、続けてカテゴリ別を登場順に出すこと

入出力例

出力: "08/01 ランチ 85008/02 コーヒー 48008/02 電車代 32008/03 書籍 1200合計 2850食費 1330交通費 320教養 1200円"

ヒント

生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア
編集 LuaGate編集部
main.py
学習モード

メモ

つくる ファイル分割

⌘S で保存