ホームページ  >  記事  >  バックエンド開発  >  Python コードをより Python らしくするための 8 つのリファクタリングのヒント

Python コードをより Python らしくするための 8 つのリファクタリングのヒント

WBOY
WBOY転載
2023-04-10 15:01:401870ブラウズ

1. ネストされた if ステートメントを結合する

まずは簡単なことから始めます。このような if ステートメントを入れ子にせず、ただ 1 つに結合してください。

if a:
if b:
pass

# -> refactor
if a and b:
pas

2. ループの代わりに any を使用します

ここでは、リストに少なくとも 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)

3. for/while ループからステートメントを抽出する

ループ内で変数が定義されているのに、変更されないことがよくあります。これらは不要な操作なので、ループから外して、一度作成するだけで済みます。

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)

4. 一度だけ使用され、すぐに返されるインライン変数を削除する

最後の関数で変数を定義し、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,
}

5. if ステートメントを if 式に置き換えます

if else ステートメントを使用して変数の値を設定する代わりに、次のように if 式を使用して 1 行で値を設定できます。しかし、この復元手法には少々疑問があります。まだ最初のオプションを好む人もいますが、それは問題ありません。

if condition:
x = 1
else:
x = 2

# -> refactor
x = 1 if condition else 2

6. 警告文を追加します

#このコードを見ると、何が起こっているのかをすぐに理解するのは困難です。複数の 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

7. 割り当てを使用状況に近づける

これは前の例から改良されたコードですが、ここで何が起こっているのかを理解するにはまだ時間がかかります。そこで、帽子をかぶるべきかどうかを確認したいと思います。ロジックは次のとおりです。雨が降っていれば常に 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

8. シーケンス チェックの簡素化

これもよく見かけることです。コレクション内 (リストなど) に要素があるかどうかを確認する必要がある場合、 if len(your_list) > 0 と書く必要はなく、単に if your_list と言うだけで済みます。これは pep 8 で推奨されるアプローチであり、真実テストとも呼ばれます。 Python では空のシーケンスとセットは False と評価されるため、これが可能になります。したがって、これは文字列、タプル、リスト、辞書、セットに適用できます。

rree

以上がPython コードをより Python らしくするための 8 つのリファクタリングのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。