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

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

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

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

197閲覧

内部関数のreturnを外部関数に反映させて、外部関数を強制終了させたい

Sigma1630

総合スコア36

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/10/23 10:38

編集2019/10/23 11:00

以下のような関数があります

python

1def check_email(request): 2 email = request.data.get('email') 3 validate_email(email) 4 #色々な処理 5 #様々な処理 6 return Response(status=status.HTTP_200_OK) #成功 7 8def validate_email(email): 9 if メールのスタイルが間違っている: 10 return Response(data={'message': 'メールアドレスの形式が間違っています'},~~~) #失敗 11 if ドメインが存在しない: 12 return Response(data={'message': '@の後ろの文字列が間違っています'},~~~) #失敗

関数check_emailを走らせた時に、もしvalidate_email内で失敗したら、check_emailを強制終了させてvalidate_emailでの失敗に対応したResponseをreturnしたいです。

例えば、ドメインが存在しない場合は
return Response(data={'message': '@の後ろの文字列が間違っています'},~~~)
が走り、check_emailの
return Response(status=status.HTTP_200_OK)
は走らないようにしたいです

上記コードに関しては書き方などを変えることで課題解決できそうなのですが、本質問では
内部関数のreturnを外部に反映させて、外部関数を終了させる方法
をご教示いただけますと幸いです。

ご回答よろしくお願いいたします。

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

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

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

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

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

quickquip

2019/10/23 12:40

"check_emailを強制終了させて" と dodox86さんの回答へのコメント"実際にはvalidate_emailの後に様々な処理が走っていて" が矛盾しているように思えます。 クリアしないといけない問題点が整理されていないのではないでしょうか。
Sigma1630

2019/10/23 13:02 編集

validate_emailの後の様々な処理に関してはvalidate_emailが失敗を返した場合走らせる必要のないものという想定で書かせていただきました。以下の記述と同じことがやりたかったということです。 ``` def check_email(request): ␣␣email = request.data.get('email') ␣␣if メールのスタイルが間違っている: ␣␣␣␣return Response(data={'message': 'メールアドレスの形式が間違っています'},~~~) #失敗 ␣␣if ドメインが存在しない: ␣␣␣␣return Response(data={'message': '@の後ろの文字列が間違っています'},~~~) #失敗 ␣␣#色々な処理 ␣␣#様々な処理 ␣␣return Response(status=status.HTTP_200_OK) #成功 (空白が効かないので␣をインデントに用いています) ``` 説明足らずで恐縮です
guest

回答2

0

ベストアンサー

単純にこれでいいのでは?

Python

1def check_email(request): 2 email = request.data.get('email') 3 invalid = validate_email(email) 4 if invalid: 5 return invalid 6 #色々な処理 7 #様々な処理 8 return Response(status=status.HTTP_200_OK) #成功 9 10def validate_email(email): 11 if メールのスタイルが間違っている: 12 return Response(data={'message': 'メールアドレスの形式が間違っています'},~~~) #失敗 13 if ドメインが存在しない: 14 return Response(data={'message': '@の後ろの文字列が間違っています'},~~~) #失敗 15 return False

関数名と返すものがマッチしてないので、ネーミング的にいまいちですが。

投稿2019/10/23 11:18

編集2019/10/23 11:19
otn

総合スコア84499

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

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

Sigma1630

2019/10/23 13:22

一旦変数で受けてあげないといけないということですね。 もともと関数を2つに分離する前は def check_email(request): ␣␣email = request.data.get('email') ␣␣if メールのスタイルが間違っている: ␣␣␣␣return Response(data={'message': 'メールアドレスの形式が間違っています'},~~~) #失敗 ␣␣if ドメインが存在しない: ␣␣␣␣return Response(data={'message': '@の後ろの文字列が間違っています'},~~~) #失敗 ␣␣#色々な処理 ␣␣#様々な処理 ␣␣return Response(status=status.HTTP_200_OK) #成功 という形になっておりました。 単純に抜き出したいロジック(3~6行目)を関数にして、その関数を挟めば同じになるかと思いきや、そうでもなさそうだということがわかりました。ありがとうございます。
otn

2019/10/23 13:32

呼び出した関数を呼び出した関数に直接リターンすることはできないので、直接呼び出した関数で条件判断して分岐してリターンを中継する必要があります。 例外を使えば、飛び越して戻れますが、今回は例外を使うケースではないです。
guest

0

強制終了と言うほどのものではありませんが、

Python3

1def check_email(request): 2 email = request.data.get('email') 3 return validate_email(email) 4 5def validate_email(email): 6 if メールのスタイルが間違っている: 7 return Response(data={'message': 'メールアドレスの形式が間違っています'},~~~) #失敗 8 if ドメインが存在しない: 9 return Response(data={'message': '@の後ろの文字列が間違っています'},~~~) #失敗 10 11 # ここまで到達したら、成功と言うことだから 12 return Response(status=status.HTTP_200_OK) #成功

ではダメなのでしょうか。

投稿2019/10/23 10:51

dodox86

総合スコア9183

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

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

Sigma1630

2019/10/23 10:56

ありがとうございます。こう書きたいのは山々なのですが、実際にはvalidate_emailの後に様々な処理が走っていて、必ずしもvalidate_emailでcheck_emailを終わらせられないという背景があります。 後出しですみません、編集させていただきます。
dodox86

2019/10/23 11:09

なるほど。try~exceptでくくって、内部から raiseではちょっと乱暴な気がしないでもないですね。改めて他回答者さまらによる、より良い回答をお待ちください。(私も興味あります)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問