まずは簡単なことから始めます。このような if ステートメントを入れ子にせず、ただ 1 つに結合してください。
if a: if b: pass # -> refactor if a and b: pas
ここでは、リストに少なくとも 1 つの肯定的な要素があるかどうかを確認します。より長い解決策は、すべての数値をループし、現在の数値を確認し、条件が true の場合に中断することです。ただし、このタスクには、Python の特殊なメソッドである any 関数があります。 any は、反復可能要素のいずれかの要素が true の場合に True を返します。これは手動ループよりもはるかに短く、よりPython的です。
numbers = [-1, -2, -4, 0, 3, -7] has_positives = False for n in numbers: if n > 0: has_positives = True break # -> refactor has_positives = any(n > 0 for n in numbers)
ループ内で変数が定義されているのに、変更されないことがよくあります。これらは不要な操作なので、ループから外して、一度作成するだけで済みます。
for building in buildings: city = 'London' addresses.append(building.street_address, city) # -> refactor city = 'London' for building in buildings: addresses.append(building.street_address, city)
最後の関数で変数を定義し、1 行後にすぐに返されるコードをよく見かけます。関数の動作がわかっている場合は、結果を直接返すだけです。これはより簡潔であり、不必要な変数を避けます。ただし、関数が何をしているのかが明確でない場合は、最後の変数に意味のある名前を付けて、自己文書化コードとして使用することができます。
def state_attributes(self): """Return the state attributes.""" state_attr = { ATTR_CODE_FORMAT: self.code_format, ATTR_CHANGED_BY: self.changed_by, } return state_attr # -> refactor def state_attributes(self): """Return the state attributes.""" return { ATTR_CODE_FORMAT: self.code_format, ATTR_CHANGED_BY: self.changed_by, }
if else ステートメントを使用して変数の値を設定する代わりに、次のように if 式を使用して 1 行で値を設定できます。しかし、この復元手法には少々疑問があります。まだ最初のオプションを好む人もいますが、それは問題ありません。
if condition: x = 1 else: x = 2 # -> refactor x = 1 if condition else 2
#このコードを見ると、何が起こっているのかをすぐに理解するのは困難です。複数の if-else ステートメントと複数のインデントがあります。よく見ると、最初の if ステートメントが関数コードのほぼ全体をカバーしていることに気づくかもしれません。最後に対応する else 節があり、False を返すだけです。
この else 節を先頭に移動できます。これは注意喚起とも呼ばれます。したがって、条件が true でない場合、関数コードの残りの部分は実行されません。これにより、else 句が削除され、コード全体のインデントのレベルが 1 つ減りました。これはより明確で理解しやすくなります。
def should_i_wear_this_hat(self, hat): if isinstance(hat, Hat): current_fashion = get_fashion() weather_outside = self.look_out_of_window() is_stylish = self.evaluate_style(hat, current_fashion) if weather_outside.is_raining: print("Damn.") return True else: print("Great.") return is_stylish else: return False # -> refactor def should_i_wear_this_hat(self, hat): if not isinstance(hat, Hat): return False current_fashion = get_fashion() weather_outside = self.look_out_of_window() is_stylish = self.evaluate_style(hat, current_fashion) if weather_outside.is_raining: print("Damn.") return True else: print("Great.") return is_stylish
これは前の例から改良されたコードですが、ここで何が起こっているのかを理解するにはまだ時間がかかります。そこで、帽子をかぶるべきかどうかを確認したいと思います。ロジックは次のとおりです。雨が降っていれば常に True と言い、雨が降っていなければ、帽子がスタイリッシュであれば True と言います。このロジックの可読性を大幅に向上させる簡単な方法の 1 つは、割り当てを使用状況に近づけることです。 if ステートメントを使用する前に、気象条件を理解する必要があります。これで、fashion 変数と style 変数は else 句でのみ必要となるため、下に移動します。何が起こっているのかがより明確になるはずです。
上記の項目 4 では、コードをさらに短縮して、評価スタイルの結果をすぐに返すことができます。この場合、 is_stylish の方が良い名前です。帽子がスタイリッシュであれば True 、そうでなければ False であることがわかるからです。したがって、ここでは追加の変数をそのままにしておきます。
def should_i_wear_this_hat(self, hat): if not isinstance(hat, Hat): return False current_fashion = get_fashion() weather_outside = self.look_out_of_window() is_stylish = self.evaluate_style(hat, current_fashion) if weather_outside.is_raining: print("Damn.") return True else: print("Great.") return is_stylish # -> refactor def should_i_wear_this_hat(self, hat): if not isinstance(hat, Hat): return False weather_outside = self.look_out_of_window() if weather_outside.is_raining: print("Damn.") return True else: print("Great.") current_fashion = get_fashion() return self.evaluate_style(hat, current_fashion) # is_stylish = self.evaluate_style(hat, current_fashion) # return is_stylish
これもよく見かけることです。コレクション内 (リストなど) に要素があるかどうかを確認する必要がある場合、 if len(your_list) > 0 と書く必要はなく、単に if your_list と言うだけで済みます。これは pep 8 で推奨されるアプローチであり、真実テストとも呼ばれます。 Python では空のシーケンスとセットは False と評価されるため、これが可能になります。したがって、これは文字列、タプル、リスト、辞書、セットに適用できます。
rree以上がPython コードをより Python らしくするための 8 つのリファクタリングのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。