結論
辞書の値に関数を紐づければ直線的な処理にできる場合があるとわかりました。
もちろん Lambda 式も紐づけられます。
普段は値や配列を紐づけることが多いので、ちょっと感動してこの記事を書いてみます。
前提
辞書とは
辞書 (dict) とは Python におけるデータ構造の一つで一意の「キー」と「値」を紐づけて管理するオブジェクトです。
サンプルコード(Python 3.12 で動作確認済み)
たとえば、都道府県の「キー」に対して、県庁所在地を「値」として紐づけると次のようになります。
prefectures: dict[str, str] = {
"北海道": "札幌市",
"岩手県": "盛岡市",
"宮城県": "仙台市",
}
print(prefectures["北海道"]) # 出力値:札幌市
「値」に紐づけられるのは文字列や数値だけではなく、リスト、辞書やオブジェクトも設定できます。
辞書に慣れていない方にとっては少し難易度が高いかもしれませんが、こんな感じです。
prefectures: dict[str, dict[str, str | list[str]]] = {
"東京都": {
"県庁所在地": "新宿区",
"観光地": ["東京タワー", "スカイツリー"]
},
"大阪府": {
"県庁所在地": "大阪市",
"観光地": ["大阪城", "通天閣"]
},
}
print(prefectures["大阪府"]["県庁所在地"]) # 出力値:大阪市
print(prefectures["東京都"]["観光地"]) # 出力値:['東京タワー', 'スカイツリー']
本題
さっそく、辞書の値に関数を紐づけた場合とそうでない場合を見比べてみましょう。
説明用コード(このままでは動きません)
def _setup_constraints(self) -> None:
apply_methods = {
"amount": self._apply_amount_or_energy_constraint,
"energy": self._apply_amount_or_energy_constraint,
"ratio": self._apply_ratio_constraint,
}
for constraint in self.constraints:
unit = constraint.unit
apply_method = apply_methods[unit]
apply_method(constraint)
def _setup_constraints(self) -> None:
for constraint in self.constraints:
unit = constraint.unit
if unit in ["amount", "energy"]:
self._apply_amount_or_energy_constraint(constraint)
elif unit == "ratio":
self._apply_ratio_constraint(constraint)
ご覧のとおり、unit の値に応じた関数を実行することに変わりはないのですが、分岐を気にしなくてもよくなりました。
あらためて結論
辞書の値に関数を紐づけておくことで直線的な処理となり、スッキリしたような気がします。
このプログラムにおいてやる必要があるかは少し怪しいですが、個人的には気に入りました。