質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

2654閲覧

raise文が関数のメソッドになっているとき

Shingodate1

総合スコア4

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/16 03:13

pythonのraise文について質問です。
try-except内にraise+クラス名+(引数)を書き込みexceptで引数を渡し、raiseで例外を送出するという一般的な方法に対し、下記のコードは関数のメソッドでraiseが組み込まれているタイプのコードがよく理解できません。
お忙しいところ恐縮ですがご教授いただけたら幸いです。

python

1class kusanagi(Exception): 2 pass 3 4def raise_character(a): 5 print("Saya's") 6 raise kusanagi 7 print("goofy") 8 9def func(name: int): 10 try:1 11 print(name, "is a") 12 raise_character(name) 13 except kusanagi: 14 print("reliable") 15 raise Exception 16 17name = "Magatama" 18 19try: 20 func(name) 21 22except Exception: 23 print("partner")

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/06/16 03:30

コード全体が例外に関する"一般的な使われ方"の説明のためのコードになっているように見えます。 > 関数のメソッドでraiseが組み込まれているタイプのコード が具体的にどの行を指して言っているのか分かりませんでした。
quickquip

2021/06/16 03:40

"関数のメソッド"は意図が分からない(かつ元を想像できない)ので、何かを削るか足した方がいいかと思いました。
Shingodate1

2021/06/16 05:49

やはりそうですよね。 一番最初のtry文の:の後にある1は誤字ですが、それ以外に誤字はありません。 これはpython基礎認定試験の問題です。 正解することはできましたが、このコードが何をしようとしているのか分からなかったので質問させて頂きました。 早急のご回答ありがとうございました。
quickquip

2021/06/16 06:01

多分、指摘事項が通じてないような気がします。 python基礎認定試験に「関数のメソッド」とか「関数のメソッドでraiseが組み込まれている」と書いてあるということはないですよね? これらは質問者さんの表現ではないでしょうか。そのあたりが伝わらないので、質問の意図(=質問者さんが聞きたいこと)が伝わってません。 このコードは"例外の振る舞いを説明するため"のコードだと思います。
Shingodate1

2021/06/16 06:55

申し訳ございません。 > 関数のメソッドでraiseが組み込まれているタイプのコード が具体的にどの行を指して言っているのか分かりませんでした。 上記の文章を見落としていました。 > def raise_character(a): print("Saya's") raise kusanagi print("goofy") ここのdef関数についてです。
quickquip

2021/06/16 08:34

なんとなくは伝わってきましたが、"関数のメソッド"が意図不明なのがなんとも……。「床屋の美容院」とか「マンションのアパート」ぐらいのおかしさを感じる使い方です。(どうも「メソッド」を普通じゃない意味で使っている予感)
guest

回答3

0

ベストアンサー

例外の正しい動作や機能についての説明は他の方がコメントで補足されているので、それを参考にしてください。

下記は、それ以前の基本的な部分の理解を正すための補助的なものです。(念のため、という程度です)

(詳しい方へ:厳密にいえば間違っている表現があるかもしれませんが、平易な理解のためにあえて説明をすっ飛ばしている面もある旨ご了承ください。)


「関数のメソッドでraiseが組み込まれているタイプのコードがよく理解できません」とのことですが、

1.

def raise_character(a): print("Saya's") raise kusanagi # ここ print("goofy")

ここの3行目のkusanagiは「関数」でもなく「関数のメソッド」でもありません。「クラス名」です。

で、kusanagiは以下のように括弧の中に「Exception」が書かれています。

class kusanagi(Exception): pass

これは,kusanagiクラスはExceptionを継承しているという意味です。
Exceptionを継承したクラスは、通常の例外と同じように扱えます。

この場合、コード中の
raise kusanagi

raise Exception

と同じ意味になります。

2.

def func(name: int): try: print(name, "is a") raise_character(name) # ここ except kusanagi: print("reliable") raise Exception

 
もし、質問の「関数のメソッドでraiseが組み込まれているタイプ」を、「raise_character(name)」という部分に対して言っているのであれば、それも誤りです。

「raise_character」というのは、単にraiseという単語が入っている関数名に過ぎません。
この「raise_」に特別な意味はありません。

「raise_character」という関数名を全く別の関数名(たとえばhogehoge)に変えても、全く同じ動きになります。

diff

1class kusanagi(Exception): 2 pass 3 4+def hogehoge(a): 5 print("Saya's") 6 raise RuntimeException 7 print("goofy") 8 9def func(name: int): 10 try: 11 print(name, "is a") 12+ hogehoge(name) # ここ 13 except kusanagi: 14 print("reliable") 15 raise Exception

投稿2021/06/17 01:06

編集2021/06/17 01:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shingodate1

2021/06/18 02:05

>これは,kusanagiクラスはExceptionを継承しているという意味です。 Exceptionを継承したクラスは、通常の例外と同じように扱えます。 ここの部分があやふやで自分で仮定していたどまりだったので、このように確信にせまることができました。ありがとうございました。
guest

0

質問のコードはraiseの機能を説明するために書かれたものです。説明するためという以外の機能はここにはありません。

どのprint文がどの順番で実行されるか、またどのprint文が実行されないかを、これを実行して試すことで教えるためのコードです。

まずは謙虚に、質問に書いてあるコードがどういう振る舞いをするかを観察するべきかと思います。

実行してみて「なぜこうなるのか?」という質問であれば分かりますが、「よく理解できません」という質問をするようなコードではありません。


try-except内にraise+クラス名+(引数)を書き込みexceptで引数を渡し、raiseで例外を送出するという一般的な方法に対し、下記のコードは(略)タイプのコードがよく理解できません。

質問に書いてあるような使い方のケースが一般的で、try文の中にraise文を書き込むケースが少数派でしょう。
(そうした方が記述がすごく簡潔になるという状況でもなければ、try文の中にraise文を書くことはないと思います)


goofyはprintされないはずです。「printされない」という事象を観察して、「この行は実行されていない」と事実を認識します。そこから帰納的に「raiseしたら関数の残りの行は実行されない」という機能の理解をします。

このコードは説明のためのコードです。このprintはなんなんだ? と考えるようなコードではありません。
テストとしてraise文の機能を理解しているかを問うコード
実行してprintされないことを確認するためのコード
だと思ってください。


例えば以下のコードを実行してみてください。そして質問のコードとの挙動の違いを考えてください。
それでraiseとexceptに例外の種類を書いた時の機能を考えてみてください。

python

1class kusanagi(Exception): 2 pass 3 4def raise_character(a): 5 print("Saya's") 6 raise RuntimeException 7 print("goofy") 8 9def func(name: int): 10 try: 11 print(name, "is a") 12 raise_character(name) 13 except kusanagi: 14 print("reliable") 15 raise Exception 16 17name = "Magatama" 18 19try: 20 func(name) 21 22except Exception: 23 print("partner")

プログラミングの理解には(乱暴に言うと)2つの道筋があります。
一つは、言語仕様を読んでどういう機能を持っているかを理解する
一つは、実際のコード例と実行結果からどういう機能を持っているかを理解する
です。

質問者さんは前者をさぼって、後者の道に入っていて、にも関わらず後者やらないで「気になります」と言っているだけに見えます。

投稿2021/06/16 09:27

編集2021/06/17 00:31
quickquip

総合スコア11202

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shingodate1

2021/06/16 23:56

説明が足りず申し訳ございません。 以下の点が気になりましたので、これらの部分についてご教授頂けたら幸いです。 まず最初の二つの例外、def raise_character(a)とraise kusanagiに違和感を覚えました。何故なら関数内にraise文があるコードは見たことあったんですが、関数名にraise、さらにその関数内にもraiseがあったからです。関数名にraiseがあるとどのような変化がありますか? またraise kusanagiの直下にあるprint(googy)はどこにかかっているのか、なぜ同じクラス名を引き継いでるexcept kusanagi直下のprint(reliable)のみが反応しているのか。これらの部分が気になります。
maisumakun

2021/06/17 00:08 編集

> 関数名にraiseがあるとどのような変化がありますか? 「raise」を含む名前だからといって特に違いはありません。ただの名前です。 > raise kusanagiの直下にあるprint(googy)はどこにかかっているのか 「かかっている」という、プログラミング用語でも具体的でもない単語が使われているため、何を聞きたいのかが判別できません。なお、print("goofy")はraise_character関数の一部ですが、その手前で無条件にraiseされてしまうので、実行されることはありません。
quickquip

2021/06/17 00:36 編集

> 関数名にraiseがあるとどのような変化がありますか? 名前で変化があったりはしません。単にそういう名前です。("実行すると必ず例外をraiseする"ことを説明しているだけです) > またraise kusanagiの直下にあるprint(googy)はどこにかかっているのか、なぜ同じクラス名を引き継いでるexcept kusanagi直下のprint(reliable)のみが反応しているのか。これらの部分が気になります。 このコードはraise文の機能を知っているかの試験のためのコードなのかもしれません。 ですが逆に言うと、実行して、実行結果を見て、実行結果から帰納的にraise文の振る舞いを「推測させる」のによいコードだと私は思っています。 ここには「普通そんなことはしない」書き方がいっぱいあるのです。 例外の機能がわからないまま「だいたいなんとなくこんな風に使うもの」というパターンでしか使えない人がいた時に、そういう人をふるい落とす、あるいは考えさせるコードだと思います。 > またraise kusanagiの直下にあるprint(googy)はどこにかかっているのか、なぜ同じクラス名を引き継いでるexcept kusanagi直下のprint(reliable)のみが反応しているのか。 「なぜ」を問う意味を私は感じません。raiseの機能の通りに動くだけです。どこの行がどの順番で動いてどの行が動かないかを「観察する」ことで、raiseの機能を考えましょう。
quickquip

2021/06/17 00:39

「こうなると思ったのに、実際はこうなった。なぜこうなるの?」ならわかりますが。 「こうなった。なぜ?」は困惑します。
Shingodate1

2021/06/18 01:52

丁寧なご回答ありがとうございます。 >名前で変化があったりはしません。単にそういう名前です。 そのように認識させて頂きます。またこのタイプのコードは関数内関数というものではないでしょうか? >ここには普通そんな書き方はしない書き方がたくさんある。 分かりました。改めてそれぞれの行をちゃんと見直し再度確認致します。 ご丁寧に解説してくださいましてありがとうございました。
quickquip

2021/06/18 01:57

関数内関数は登場してないです。
Shingodate1

2021/06/18 02:59

一応def表記が関数内にあるということで聞いてみました。 分かりました。ありがとうございます!
quickquip

2021/06/18 03:02

> 一応def表記が関数内にあるということで どこですか?????????
quickquip

2021/06/18 03:02

え、見えない文字が書いてあったりするんでしょうか?
quickquip

2021/06/18 03:03 編集

同じモノが別に見えているようでこわい。
guest

0

Pythonのメソッドでraiseをあげることは普通にあります。

しかし提示されたコードが正しいとすると、raise_characterもfuncもメソッドではありません。

投稿2021/06/16 03:23

ppaul

総合スコア24668

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shingodate1

2021/06/16 05:50

それらがメソッドではないとするとdefをつける意味は他にあるのでしょうか?
ppaul

2021/06/16 12:00

メソッドというのは、クラス定義の中で定義するものです。 raise_characterもfuncもクラス定義の外で定義されているので関数とは呼びますがメソッドとは呼びません。
Shingodate1

2021/06/18 01:59

承知致しました。 今回も丁寧に教えてくださりありがとうございました。 メソッドの定義を分かっていなかったのでこのようなコメントしていただいたことに感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問