Heim > Artikel > Backend-Entwicklung > Acht Refactoring-Tipps, um Python-Code pythonischer zu machen
Wir fangen einfach an. Verschachteln Sie if-Anweisungen wie diese nicht, sondern kombinieren Sie sie einfach zu einer.
if a: if b: pass # -> refactor if a and b: pas
Hier wollen wir prüfen, ob es mindestens ein positives Element in der Liste gibt. Eine längere Lösung besteht darin, alle Zahlen zu durchlaufen, die aktuelle Zahl zu überprüfen und dann abzubrechen, wenn die Bedingung erfüllt ist. Aber für diese Aufgabe gibt es in Python eine spezielle Methode, die Funktion „any“. any gibt True zurück, wenn ein Element der Iterable wahr ist. Dies ist viel kürzer und pythonischer als eine manuelle Schleife.
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)
Oft sehen Sie eine in der Schleife definierte Variable, die sich jedoch nie ändert. Dies sind unnötige Vorgänge. Ziehen Sie sie also aus der Schleife und Sie müssen sie dann nur noch einmal erstellen.
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)
Oft sehen Sie Code, der eine Variable in der letzten Funktion definiert und eine Zeile später sofort zurückkehrt. Wenn Sie wissen, was die Funktion tut, geben Sie das Ergebnis einfach direkt zurück. Dies ist prägnanter und vermeidet unnötige Variablen. Wenn jedoch manchmal nicht klar ist, was die Funktion tut, können Sie der letzten Variablen einen aussagekräftigen Namen geben und sie als selbstdokumentierenden Code verwenden.
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, }
Anstatt die if else-Anweisung zum Festlegen des Werts einer Variablen zu verwenden, können Sie sie in einer Zeile mit einem if-Ausdruck wie diesem festlegen. Allerdings ist diese Rekonstruktionstechnik etwas fragwürdig. Manche Leute bevorzugen immer noch die erste Option, und das ist in Ordnung.
if condition: x = 1 else: x = 2 # -> refactor x = 1 if condition else 2
Wenn man sich diesen Code ansieht, ist es schwer, schnell zu verstehen, was vor sich geht. Es gibt mehrere if-else-Anweisungen und mehrere Einrückungen. Wenn Sie genau hinschauen, werden Sie vielleicht bemerken, dass die erste if-Anweisung fast den gesamten Funktionscode abdeckt, nur dass wir am Ende die entsprechende else-Klausel haben und einfach False zurückgeben.
Wir können diese else-Klausel an den Anfang verschieben. Dies wird auch als Warnhinweis bezeichnet. Wenn die Bedingung also nicht wahr ist, werden wir den Rest des Funktionscodes nicht ausführen. Dadurch wird eine else-Klausel entfernt, und im gesamten Code gibt es nun eine Einrückungsebene weniger. Das sieht klarer und verständlicher aus.
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
Dies ist ein verbesserter Code gegenüber dem vorherigen Beispiel, aber es dauert noch einige Zeit, um zu verstehen, was hier vor sich geht. Deshalb wollen wir prüfen, ob wir einen Hut tragen sollten. Die Logik ist folgende: Wenn es regnet, sagen wir immer „True“, wenn es nicht regnet und wenn der Hut stilvoll ist, sagen wir immer „True“. Eine einfache Möglichkeit, die Lesbarkeit dieser Logik erheblich zu verbessern, besteht darin, die Zuordnung näher an ihre Verwendung heranzuführen. Wir müssen die Wetterbedingungen verstehen, bevor wir die if-Anweisung verwenden. Jetzt werden die Variablen fashion und style nur noch in der else-Klausel benötigt, also verschieben Sie sie nach unten. Es sollte jetzt klarer sein, was los ist.
In Punkt 4 oben können wir den Code weiter kürzen und die Ergebnisse des Bewertungsstils sofort zurückgeben. In diesem Fall ist is_stylish ein besserer Name, da er Ihnen sagt, dass Sie „True“ sagen, wenn der Hut stilvoll ist, andernfalls „False“. Behalten Sie also einfach die zusätzlichen Variablen hier.
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
Das ist eine weitere Sache, die ich oft sehe. Wenn Sie überprüfen müssen, ob ein Element in einer Sammlung vorhanden ist, beispielsweise in einer Liste, müssen Sie nicht schreiben, ob len(your_list) > 0 ist. Sie können einfach if your_list angeben. Dies ist der von Pep 8 empfohlene Ansatz, der auch als Wahrheitsprüfung bezeichnet wird. Dies ist möglich, weil in Python leere Sequenzen und Mengen als False ausgewertet werden. Dies kann also auf Zeichenfolgen, Tupel, Listen, Wörterbücher und Mengen angewendet werden.
if len(list_of_hats) > 0: hat_to_wear = choose_hat(list_of_hats) # -> refactor if list_of_hats: hat_to_wear = choose_hat(list_of_hats)
Das obige ist der detaillierte Inhalt vonAcht Refactoring-Tipps, um Python-Code pythonischer zu machen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!