🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Python

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

Q&A

解決済

2回答

4601閲覧

Python 関数を複数使用するスクリプトの構造に関して

stwebyy

総合スコア14

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2019/09/18 12:52

編集2019/09/18 15:25

質問したいこと

現在、業務でスクリプトを作成しています。
関数を複数使用するスクリプトを作成する場合のベストプラクティスを知りたいと思っています。
例えば、スクリプトの内容は以下になります。

作成内容

  1. Aという値を作成する
  2. Bという値をAから作成する(作成するにはAのIDが必要)
  3. Cという値をBから作成する(作成するにはBのIDが必要)

###スクリプトの例1

Python

1def method01(): 2 value01 = 'create_value' 3 return value01 4 5def method02(): 6 value01 = method01() 7 value02 = value01 + '例1' 8 return value02 9 10def method03(): 11 value02 = method02() 12 value03 = value02 + '例2' 13 return value03 14 15if __name__ == '__main__': 16 method03()

このスクリプトは実際、私が作成しているものと似た作りになっています。(見苦しいコードですみません。。)

こういった場合は、以下の例2のように作成するのが正解でしょうか?

###スクリプトの例2

Python

1def method01(): 2 value01 = 'create_value' 3 return value01 4 5def method02(val01): 6 value02 = val01 + '例1' 7 return value02 8 9def method03(val02): 10 value03 = val02 + '例2' 11 return value03 12 13if __name__ == '__main__': 14 first = method01() 15 second = method02(first) 16 third = method03(second)

また、一つ目の関数がエラーなく実行された場合のみ、二つ目の関数が実行される。二つ目の関数がエラーなく実行された場合のみ三つ目の...という処理を実装する場合は最後のif __name__ == '__main__':以下にif文を作成するというやり方がシンプルで良いのでしょうか?

###スクリプトの例3

Python

1def method01(): 2# エラーでなければvalue01にvalue01が入ると仮定 3 value01 = request.post('https://test.co.jp', headers='test_headers', data='test_data') 4 if value01.status_code == 404: 5 value01 = 'False' 6 return value01 7 8def method02(val01): 9# エラーでなければvalue02にvalue02が入ると仮定 10 value02 = request.post('https://test.co.jp', headers='test_headers', data=val01) 11 if value02.status_code == 404: 12 value02 = 'False' 13 return value02 14 15def method03(val02): 16 value03 = val02 + '例2' 17 return value03 18 19if __name__ == '__main__': 20 first = method01() 21 if first == 'value01' 22 second = method02(first) 23 if second == 'value02' 24 third = method03(second)

3つ目の例くらいしか思い浮かばなかったです・・・。
ただ、本来はレスポンスの値が固定値ではないため、こんな書き方はできないと思います。
皆さんならこうする、もしくはこうした方が良いという書き方を教えていただけませんか?
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

まず、関数同士は関係性を低くすると流用しやすいしデバッグもしやすいです。
そういう意味では例1より例2ですね。

次に、流れの制御ですが…
関数からの戻りを結果とデータのタプルにして、受け側では結果をみて判定する
というかたちにすると、他の人がみたときに分かりやすいかもしれません。

あと、どこまで実行されたか(どこでエラーが起きたか)などをおさえておく
必要があるなら少し工夫が必要になりますかね。

投稿2019/09/18 23:02

takasima20

総合スコア7460

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

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

stwebyy

2019/09/19 13:35

回答ありがとうございます! 仰る通り、独立性がある方が良いというのは認識していました。 そうすると例2の方が良さそうですね。 また、確かに返り値を2つというのは他の人から見たらわかりやすそうです。 業務のスクリプトもそれで作成してみようと思います。 参考にさせていただきます。
guest

0

ベストアンサー

自分がやるとしたらでの回答になりますが自分なら例2のやり方を採用します。

また、一つ目の関数がエラーなく実行された場合のみ、二つ目の関数が実行される。

エラー処理に関しては2つやり方が考えられて

  1. 例外を投げられるものなら例外を投げて処理する方法
  2. 関数からの戻り地をチェックしてif-elseで分岐してスクリプトを終了する方法

補足として例3のスクリプトのコードでTrue/Falseを文字列で扱ってしまっているのでそこは修正したほうが良いです。あとは他の言語のnullと似た値としてNoneがあるのでこの値をエラー処理のために返すといった方法もあります。

if value01.status_code == 404: value01 = False

投稿2019/09/18 16:53

yuokada

総合スコア550

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

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

stwebyy

2019/09/19 13:33

ありがとうございます! やはり例2のやり方ですよね。 また、True、Falseの件ご指摘ありがとうございます。 うっかり文字列にしてしまいました。 無意識でも文字列にしないように気をつけていきたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問