【Python 雑談・雑学】 else ステートメントは if 文、for 文とだけではなくて try ブロックでも使えるよ、とアドバイスしたら、またまた感心されていい気分になった話 投稿一覧へ戻る

Tags: Python , miscellaneous , else , finally , try , exception

Published 2020年5月23日19:47 by T.Tsuyoshi

次のコードでは、User オブジェクト作成時に渡される grades パラメータはディクショナリであり、キーとして 'algebra' と 'programming' が含まれていることを前提としています。


class User:
def __init__(self, name, grades):
self.name = name
self.grades = grades
self.weighted_score = 0

def __repr__(self):
return f'<User {self.name}>'


def email_engaged_user(user):
try:
user.weighted_score = calculate_weighted_score(user.grades)
except KeyError:
print('異なるキー名が指定されました。')
else:
if user.weighted_score > 500:
send_grade_notification(user)


def calculate_weighted_score(grades):
return grades['algebra'] * 5 + grades['programming'] * 2


def send_grade_notification(user):
print(f'この通知は {user.name} へ送っています。{user.weighted_score} 点を獲得しました。')



もしこれらのキーが含まれていない場合、calculate_weighted_score() での実行でエラーが発生し、それが呼び出し元である email_engaged_user() でキャッチされます。


この場合は当たり前ですが except KeyError: ブロックが実行されて、設定した print ステートメントでエラーが出力されます。例えば下を実行してみましょう。


my_user = User('Nana', {'algebla': 73, 'programming': 100})
email_engaged_user(my_user)

# 異なるキー名が指定されました。




では、try ブロックが正常に終了した場合、必ず何らかの処理をしたい場合はどうしたらいいでしょう?


finally ステートメントを最後に追加しますか?


ご存知のように finally ステートメントは、エラーが発生してもしなくても必ず実行されます。
ですから、この場合には利用できません。


実は、try ブロックに else ステートメントを含めると、例外が発生せずに処理が通常に終了した場合のみ実行したい処理を記述することができます。


下を実行してみてください。


my_user = User('Nana', {'algebra': 73, 'programming': 100})
email_engaged_user(my_user)

# この通知は Nana へ送っています。565 点を獲得しました。




calculate_weighted_score() が正常に終了した場合に限り、else ステートメントが実行され、if 判定が True であれば send_grade_notification() が実行されるているのが分かると思います。


先日も記事にしたように、else ステートメントは if 文だけではなく、for 文とも try 文とも使えるんです。


こんなアドバイスをしたら、またまた感心されて、ちょっといい気分です。

この投稿をメールでシェアする

0 comments

コメントはまだありません。

コメントを追加する(不適切と思われるコメントは削除する場合があります)