つくる ファイル分割
このレッスンでできるようになること。家計簿を data.py と report.py と呼び出し側の3つに、責務で分けられるようになります。新しい文法は出てきません。第1章で覚えた道具だけで1本組み上げます。
なぜ分けるのか
入門で作った家計簿は1つのファイルにデータも計算も表示も全部入っていました。行数が増えると、直したい処理を探すだけで時間がかかります。役割ごとにファイルを分けておくと、修正したい場所が名前で分かります。
分け方の定番は次のとおりです。
data.pyはデータを持つ。支出の一覧そのものreport.pyは計算と整形をする。合計、カテゴリ別集計、1行の書式- 呼び出し側は流れだけを書く。どのデータをどう出すかの手順
依存の向きを一方通行にする
分けるときに大事なのは、矢印の向きを揃えることです。呼び出し側は data と report を読み込みますが、report は data を読み込みません。report.total(expenses) のように、集計したいリストを引数で受け取る形にしておくと、report.py はどんなデータにも使い回せます。逆に report.py の中で data.EXPENSES を直接読んでしまうと、そのデータ専用の道具になってしまいます。
今回の出力
明細を4行、合計を1行、カテゴリ別を3行の順に出します。日付は %m/%d で 08/01 の形に揃え、カテゴリ別は最初に登場した順で出します。Python の辞書は入れた順を覚えているので、ふつうに for で回せばその順に出ます。
演習ではファイルを文字列として書き出してから読み込みますが、実務ではエディタで3つのファイルを作るだけです。分け方の考え方は同じです。
要件
- data.py に EXPENSES を、report.py に format_line / total / by_category を書き出すこと
- report.py の関数は引数で支出リストを受け取り、data を読み込まないこと
- 明細4行のあとに 合計 2850円 を出し、続けてカテゴリ別を登場順に出すこと
入出力例
出力: "08/01 ランチ 850円
08/02 コーヒー 480円
08/02 電車代 320円
08/03 書籍 1200円
合計 2850円
食費 1330円
交通費 320円
教養 1200円"ヒント
編集 LuaGate編集部