[解決済み] 変数ret_valの使用はいつがよいのでしょうか?
質問
次のコードが良いかどうか、相反するアドバイスを見たことがあります。
def function():
ret_val = 0
if some_condition():
ret_val = 2
else:
ret_val = 3
return ret_val
とか、こっちの方がいいんじゃない?
def function():
if some_condition():
return 2
else:
return 3
これは簡単な例で、pythonスタイルで書きましたが、私が探しているのは、戻り値を追跡するためにいくつかの"accumulator"変数をいつ使うか、または複数の出口点を使うかについての一般原則なのです。 言語によって、1つのスタイルを使用する理由が異なることは承知していますので、特定の言語が特定のスタイルに固執する理由についての異なる視点を評価したいと思います。(特に過去には、C言語の構造化プログラミングでは、関数の出口を複数にすることを避けると聞いたことがあります)。
どのように解決するのか?
そもそも、なぜ「複数の終了点」が有害とされたのか、忘れてしまったのでしょうか。 その昔(優れた例外処理と最終的な構成に広くアクセスする前、あるいは
auto_ptr
これは、多くのマルチエグジット関数につきまとう問題でした。
int function blah(arg1, arg2)
allocate resource
if early failure detection
return failure_status
... much later...
release resource // oh rats! resource didn't release
return success_status
リソースがメモリである場合、メモリリークが発生します。 もしそれがデータベーストランザクションであれば、悪いデータベースの競合やデッドロックに向かうことになる。 それに関しては、より多くの例外サポートの出現により、我々は暗黙のうちに
多く
処理されない例外によって)メソッドを終了する可能性があります。 C++時代、私はこのような習慣を身につけました。
決して
は削除を呼び出すのではなく
auto_ptr
を実行したときに、割り当てられたメモリがクリーンアップされるようにしました。
auto_ptr
がスコープを抜けると、たとえ予期せぬ例外が頭をもたげてきたとしても、です。
ガベージコレクションのPythonの世界では、ファイルやロックなどの多くのオブジェクトがセルフクリーニングの動作を改善しているにもかかわらず、この問題が発生する可能性があります。 しかし、CPython以外の実装(jythonやIronPythonなど)では、デストラクタがいつ呼ばれるか保証はありません。 そのための最初の仕組みが try/finally です。
int function blah(arg1, arg2)
allocate resource
try:
if early failure detection
return failure_status
... much later...
return success_status
finally:
release resource // always releases no matter what
しかし、Pythonには新しい'with'構文と連動したコンテキストマネージャがあります。
int function blah(arg1, arg2)
allocate resource
with context_manager(resource): // releases on exit from 'with'
if early failure detection
return failure_status
... much later...
return success_status
つまり、この古い慣習を捨てられるのは、新しいコーディング手法によって不要になったからだということを、きちんと伝えましょう。
関連
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み] 変数を参照渡しする方法を教えてください。
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonの "assert "はどのように使うのですか?
-
[解決済み] 変数が存在するかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Python 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] データ型が理解できない
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] 関数は return 文を1つだけ持つべきですか?