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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

4回答

598閲覧

関数にif文を入れた時の動作について

fuku-chann

総合スコア82

Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2023/01/09 05:18

編集2023/01/11 07:13

test関数のif a == 0:がtrueの時だけtest3関数の中でtest2関数を動かすことはできますでしょうか?(test関数のprintの下にtest2関数を入れる以外で探しております。test3関数の中でtest関数の後にtest2関数をif a==0:がtrueの時だけ動作させたいです。)
ご存知の方おられましたらご教示お願いいたします。

python

1a = 1 2def test(): 3 if a == 0: 4 print(location(), a) 5 6def test2(): 7 print(location(), a) 8 9def test3(): 10 test() 11 test2() 12 13test3()

理由としましては、test4, test5と今後関数が増えていく予定なので、下記のような運用ができればより管理がしやすくなるからです。
test関数は共通で、実際にはコードがもっと長いです。

python

1def test3_2(): 2 test() 3 test4()

python

1def test3_3(): 2 test() 3 test5()

python

1from collections.abc import Callable 2a = 0 3 4def test(callback): 5 assert isinstance(callback, Callable), f"`callback` is not Callable, 6 if a == 0: 7 print(location(), a) 8 callback() 9 10def test2(): 11 print(location()) 12 13def test3_2(): 14 print(location()) 15 test(test2) 16 17test3_2()

zsh

1SyntaxError: unterminated string literal (detected at line 135)

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

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

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

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

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

guest

回答4

0

なにをしたいのかよーわかりませんが、

test関数のprintの下にtest2関数を入れる以外で探しております。

ということなら、そこに、test2関数の中身をコピペすればいいです。

投稿2023/01/09 10:47

y_waiwai

総合スコア87719

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

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

0

python

1def test3(): 2 test() 3 test2()

質問は、上記の記述のままで、 test関数の内部の条件によって、test2関数が実行されたりされなかったりするようにしたいということだと理解しましたが、そのような処理にすべきではないと思います。
この記述を見て、test2が実行されるかどうかわからないということでは可読性が0です。

python

1def test3(): 2 if test(): 3 test2()

このように、testは何らかの結果を呼び出し元に返すべきで、呼び出し元はその結果にもとづいて、test2を実施するかどうか判定するような作りにすべきです。

投稿2023/01/09 10:10

TakaiY

総合スコア12666

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

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

0

ベストアンサー

理由としましては、test4, test5と今後関数が増えていく予定

では,探している

test関数のprintの下にtest2関数を入れる以外で探しております

を無視して

test3関数の中でtest関数の後にtest2関数をif a==0:がtrueの時だけ動作させたいです。

を実現するしかありません.

Python

1from collections.abc import Callable 2a = 0 3def test(callback): 4 assert isinstance(callback, Callable), f"`callback` is not Callable, its {type(callback)}" 5 if a == 0: 6 print(location(), a) 7 callback() 8 9def test2(): 10 print(location(), a) 11 12def test3(): 13 test(test2) 14 15def test3_2(): 16 test(test4) 17 18def test3_3(): 19 test(test5) 20 21test3() 22test3_2() 23test3_3()

test関数が共通の処理をもっており,その中のifの条件に一致した際に可変な関数の実行がしたいという要件であればCallableを渡すようにしてやればよいでしょう.
このように実装すれば,関数がtest4(), test5()と増えていっても,test()がどのCallableを受け取るかはtest3_2(), test3_3()次第なので,要件が満たされているはずです.

投稿2023/01/09 09:17

編集2023/01/09 09:32
PondVillege

総合スコア1579

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

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

fuku-chann

2023/01/09 12:21 編集

ありがとうございます。 本文に修正後のコードとその結果を追記しましたが、下記コードをコメントアウトすれば大丈夫そうですが、下記コードを入れるとエラーになります。 assert isinstance(callback, Callable), f"`callback` is not Callable,
PondVillege

2023/01/09 12:30 編集

ちゃんとcallbackがCallableであるかをチェックする文です. もしAssertion Errorが出るならcallbackはCallableじゃないので,どのみちif文中のcallback()でエラーが起きます. もしName Errorが出るなら最初のimport文が欠けています. 質問に追記されているようなエラーであればコピペミスです 確実にcallbackがCallableであるならコメントアウトなどで消しても大丈夫です.ただのチェックする構文でしかありません.
fuku-chann

2023/01/10 11:27

pythonではダブルクオテーションで始まったらダブルクオテーションで終わらないといけないというルールがあるようです。下記でエラーがなくなりましたが、いかがでしょうか? assert isinstance(callback, Callable), f"callback is not Callable"
PondVillege

2023/01/10 12:54

はい.それでも良いですね. もしかして解答のコードが見切れたりしてるのでしょうか?私からはダブルクォーテーションで囲まれており,不足ないですが
fuku-chann

2023/01/10 20:00 編集

とても勉強になります。 コードが右側に隠れていたことに気が付きませんでした。 おっしゃる通り全文コピペしたらエラーがなくなりました。 大変失礼いたしました。 勉強のため、質問させていただきますが、callableかどうか事前に確認することには、どのようなメリットがあるのでしょうか?callableではない時はどのみちif文中のcallback()でエラーが出るので、エラーが出るタイミングが早くなるメリットはありますが、これだけだとimportも含めて2行増える方が気になってしまいます。現在はcallbackが確実にcallableですが、今後は確実とは言えませんし、折角教えていただきましたので、理解して適切に使い分けをしたいと思い、ご質問させていただいた次第です。
PondVillege

2023/01/10 20:37 編集

Callableでない かつ if文の分岐に入らない場合では,エラーにならずチェックできないからです.もしif文等の分岐が存在せず,毎回呼ばれるのならassertは確実に冗長です. 動作確認でif文に入る/入らないという状態を確認するのはコスパが悪いですが,好みの範囲だと思います
fuku-chann

2023/01/10 22:13 編集

早急なご回答ありがとうございました。なるほどです。if文があるときはcollableであることを先に確認しておいた方が良さそうですね。とても勉強になりました。ありがとうございました!!
guest

0

普通にifを書いてはいかがでしょうか

py

1a = 0 2 3def test(): 4 if a == 0: 5 print("test1") 6 7def test2(): 8 print("test2") 9 10def test3(): 11 print("test3") 12 test() 13 if a == 0: 14 test2() 15 16test3()

投稿2023/01/09 09:02

yuma.inaura

総合スコア1451

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

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

fuku-chann

2023/01/09 09:17

ご回答ありがとうございます。 test関数にはifが他にも複数あるので、別の方法で考えています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問