【Python 雑談・雑学】 else ステートメントは if 文、for 文とだけではなくて try ブロックでも使えるよ、とアドバイスしたら、またまた感心されていい気分になった話 投稿一覧へ戻る
Published 2020年5月23日19:47 by mootaro23
SUPPORT UKRAINE
- Your indifference to the act of cruelty can thrive rogue nations like Russia -
次のコードでは、User オブジェクト作成時に渡される grades パラメータはディクショナリであり、キーとして 'algebra' と 'programming' が含まれていることを前提としています。
もしこれらのキーが含まれていない場合、calculate_weighted_score() での実行でエラーが発生し、それが呼び出し元である email_engaged_user() でキャッチされます。
この場合は当たり前ですが except KeyError: ブロックが実行されて、設定した print ステートメントでエラーが出力されます。例えば下を実行してみましょう。
では、try ブロックが正常に終了した場合、必ず何らかの処理をしたい場合はどうしたらいいでしょう?
finally ステートメントを最後に追加しますか?
ご存知のように finally ステートメントは、エラーが発生してもしなくても必ず実行されます。
ですから、この場合には利用できません。
実は、try ブロックに else ステートメントを含めると、例外が発生せずに処理が通常に終了した場合のみ実行したい処理を記述することができます。
下を実行してみてください。
calculate_weighted_score() が正常に終了した場合に限り、else ステートメントが実行され、if 判定が True であれば send_grade_notification() が実行されるているのが分かると思います。
先日も記事にしたように、else ステートメントは if 文だけではなく、for 文とも try 文とも使えるんです。
こんなアドバイスをしたら、またまた感心されて、ちょっといい気分です。
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} 点を獲得しました。')
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)
email_engaged_user(my_user)
# 異なるキー名が指定されました。
では、try ブロックが正常に終了した場合、必ず何らかの処理をしたい場合はどうしたらいいでしょう?
finally ステートメントを最後に追加しますか?
ご存知のように finally ステートメントは、エラーが発生してもしなくても必ず実行されます。
ですから、この場合には利用できません。
実は、try ブロックに else ステートメントを含めると、例外が発生せずに処理が通常に終了した場合のみ実行したい処理を記述することができます。
下を実行してみてください。
my_user = User('Nana', {'algebra': 73, 'programming': 100})
email_engaged_user(my_user)
email_engaged_user(my_user)
# この通知は Nana へ送っています。565 点を獲得しました。
calculate_weighted_score() が正常に終了した場合に限り、else ステートメントが実行され、if 判定が True であれば send_grade_notification() が実行されるているのが分かると思います。
先日も記事にしたように、else ステートメントは if 文だけではなく、for 文とも try 文とも使えるんです。
こんなアドバイスをしたら、またまた感心されて、ちょっといい気分です。
この記事に興味のある方は次の記事にも関心を持っているようです...
- People who read this article may also be interested in following articles ... -