[解決済み】「if x: return x」文を回避するためのPythonicな方法
2022-04-07 15:46:54
質問
あるメソッドがあり、特定の条件をチェックするために他の4つのメソッドを順番に呼び出し、1つがTruthyを返すとすぐに(次のメソッドをチェックせずに)返します。
def check_all_conditions():
x = check_size()
if x:
return x
x = check_color()
if x:
return x
x = check_tone()
if x:
return x
x = check_flavor()
if x:
return x
return None
これはお荷物コードが多いような気がします。各2行のif文の代わりに、次のようなことをしたい。
x and return x
しかし、これは無効なPythonです。私はここでシンプルでエレガントな解決策を見逃しているのでしょうか?ちなみに、この状況では、これらの4つのチェックメソッドは高価になる可能性があるので、何度も呼び出したくはありません。
解決方法は?
ループを使えばいいんだよ。
conditions = (check_size, check_color, check_tone, check_flavor)
for condition in conditions:
result = condition()
if result:
return result
これによって、条件の数を可変にできるようになったという利点もあります。
を使うことができます。
map()
+
filter()
(Python3バージョンでは
future_builtins
バージョン
をPython 2で使用した場合)、そのような最初にマッチする値を取得します。
try:
# Python 2
from future_builtins import map, filter
except ImportError:
# Python 3
pass
conditions = (check_size, check_color, check_tone, check_flavor)
return next(filter(None, map(lambda f: f(), conditions)), None)
が、この方が読みやすいかどうかは議論の余地がある。
また、ジェネレータ式を使うという方法もある。
conditions = (check_size, check_color, check_tone, check_flavor)
checks = (condition() for condition in conditions)
return next((check for check in checks if check), None)
関連
-
[解決済み】numpy: true_divide で無効な値に遭遇
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み] AndroidでPythonを実行する方法はありますか?
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Pythonで複数行のコメントを作成する方法はありますか?
-
[解決済み] ファイルに行を書き込む正しい方法?
-
[解決済み] 存在しないかもしれないファイルを削除するための最もpythonicな方法
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
最新
-
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 call matlab メソッドの詳細
-
Python カメの描画コマンドとその例
-
PythonはWordの読み書きの変更操作を実装している
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み】csv.Error:イテレータはバイトではなく文字列を返すべき
-
[解決済み】 AttributeError: モジュール 'matplotlib' には属性 'plot' がない。
-
[解決済み】TypeError: 系列を <class 'float'> に変換することができません。
-
[解決済み】TypeErrorを取得しました。エントリを持つ子テーブルの後に親テーブルを追加しようとすると、 __init__() missing 1 required positional argument: 'on_delete'
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み] Pythonはショートカットに対応していますか?