Geschrieben von Rupesh Sharma AKA @hackyrupesh
Python ist mit seiner Einfachheit und Schönheit eine der beliebtesten Programmiersprachen der Welt. Doch auch im Jahr 2024 bereiten bestimmte Mängel den Entwicklern weiterhin Sorgen. Diese Probleme sind nicht immer auf Schwächen von Python zurückzuführen, sondern vielmehr auf dessen Design, sein Verhalten oder häufige Missverständnisse, die zu unerwarteten Ergebnissen führen. In diesem Blog-Artikel werfen wir einen Blick auf die fünf größten Python-Probleme, mit denen jeder Entwickler im Jahr 2024 immer noch konfrontiert ist, sowie auf die entsprechenden Lösungen.
Einer der berüchtigtsten Python-Fehler ist das veränderbare Standardargument. Wenn ein veränderliches Objekt (wie eine Liste oder ein Wörterbuch) als Standardargument in einer Funktion verwendet wird, wertet Python dieses Standardargument nur einmal aus, wenn die Funktion definiert wird, nicht bei jedem Aufruf der Funktion. Dies führt zu unerwartetem Verhalten, wenn die Funktion das Objekt ändert.
def append_to_list(value, my_list=[]): my_list.append(value) return my_list print(append_to_list(1)) # Outputs: [1] print(append_to_list(2)) # Outputs: [1, 2] - Unexpected! print(append_to_list(3)) # Outputs: [1, 2, 3] - Even more unexpected!
Um dies zu vermeiden, verwenden Sie None als Standardargument und erstellen Sie bei Bedarf eine neue Liste innerhalb der Funktion.
def append_to_list(value, my_list=None): if my_list is None: my_list = [] my_list.append(value) return my_list print(append_to_list(1)) # Outputs: [1] print(append_to_list(2)) # Outputs: [2] print(append_to_list(3)) # Outputs: [3]
KeyError tritt auf, wenn versucht wird, auf einen nicht vorhandenen Wörterbuchschlüssel zuzugreifen. Dies kann besonders schwierig sein, wenn Sie mit verschachtelten Wörterbüchern arbeiten oder mit Daten arbeiten, deren Struktur nicht garantiert ist.
data = {'name': 'Alice'} print(data['age']) # Raises KeyError: 'age'
Um KeyError zu verhindern, verwenden Sie die Methode get(), die None (oder einen angegebenen Standardwert) zurückgibt, wenn der Schlüssel nicht gefunden wird.
print(data.get('age')) # Outputs: None print(data.get('age', 'Unknown')) # Outputs: Unknown
Für verschachtelte Wörterbücher sollten Sie die Verwendung des defaultdict aus dem Collections-Modul oder von Bibliotheken wie Dotmap oder Pydash in Betracht ziehen.
from collections import defaultdict nested_data = defaultdict(lambda: 'Unknown') nested_data['name'] = 'Alice' print(nested_data['age']) # Outputs: Unknown
Eine übermäßige oder missbräuchliche Verwendung von Try-Except-Blöcken kann zu stillen Fehlern führen, bei denen Ausnahmen abgefangen, aber nicht ordnungsgemäß behandelt werden. Dies kann es schwierig machen, Fehler zu erkennen und zu beheben.
try: result = 1 / 0 except: pass # Silently ignores the error print("Continuing execution...")
Im obigen Beispiel wird der ZeroDivisionError abgefangen und ignoriert, aber dies kann das zugrunde liegende Problem verschleiern.
Geben Sie immer den Ausnahmetyp an, den Sie abfangen, und behandeln Sie ihn entsprechend. Das Protokollieren des Fehlers kann auch dabei helfen, Probleme aufzuspüren.
try: result = 1 / 0 except ZeroDivisionError as e: print(f"Error: {e}") print("Continuing execution...")
Für eine umfassendere Ausnahmebehandlung können Sie die Protokollierung anstelle von Pass verwenden:
import logging try: result = 1 / 0 except Exception as e: logging.error(f"Unexpected error: {e}")
Vor Python 3 wurde bei der Division zweier Ganzzahlen standardmäßig eine Bodendivision durchgeführt, wodurch das Ergebnis auf eine Ganzzahl gekürzt wurde. Obwohl Python 3 dieses Problem mit der echten Division (/) gelöst hat, haben einige Entwickler immer noch Probleme, wenn sie unbeabsichtigt die Bodendivision (//) verwenden.
print(5 / 2) # Outputs: 2.5 in Python 3, but would be 2 in Python 2 print(5 // 2) # Outputs: 2
Verwenden Sie immer / für die Unterteilung, es sei denn, Sie benötigen speziell eine Bodenunterteilung. Seien Sie vorsichtig, wenn Sie Code von Python 2 nach Python 3 portieren.
print(5 / 2) # Outputs: 2.5 print(5 // 2) # Outputs: 2
Für klaren und vorhersehbaren Code sollten Sie die Verwendung von „decimal.Decimal“ für genauere arithmetische Operationen in Betracht ziehen, insbesondere bei Finanzberechnungen.
from decimal import Decimal print(Decimal('5') / Decimal('2')) # Outputs: 2.5
Der Garbage Collector von Python übernimmt den Großteil der Speicherverwaltung, aber Zirkelverweise können bei unsachgemäßer Handhabung zu Speicherverlusten führen. Wenn zwei oder mehr Objekte aufeinander verweisen, werden sie möglicherweise nie durch Garbage Collection erfasst, was zu einer erhöhten Speichernutzung führt.
class Node: def __init__(self, value): self.value = value self.next = None node1 = Node(1) node2 = Node(2) node1.next = node2 node2.next = node1 # Circular reference del node1 del node2 # Memory not freed due to circular reference
Um Zirkelverweise zu vermeiden, sollten Sie die Verwendung schwacher Verweise über das Modul „weakref“ in Betracht ziehen, das die Müllsammlung von Verweisen ermöglicht, wenn keine starken Verweise vorhanden sind.
import weakref class Node: def __init__(self, value): self.value = value self.next = None node1 = Node(1) node2 = Node(2) node1.next = weakref.ref(node2) node2.next = weakref.ref(node1) # No circular reference now
Alternativ können Sie den Zyklus manuell durchbrechen, indem Sie die Referenzen auf „Keine“ setzen, bevor Sie die Objekte löschen.
node1.next = None node2.next = None del node1 del node2 # Memory is freed
Selbst im Jahr 2024 stoßen Python-Entwickler weiterhin auf diese häufigen Fehler. Obwohl sich die Sprache im Laufe der Jahre weiterentwickelt und verbessert hat, hängen diese Probleme oft mit grundlegenden Aspekten der Funktionsweise von Python zusammen. Wenn Sie diese Fallstricke verstehen und die entsprechenden Lösungen anwenden, können Sie robusteren, fehlerfreien Code schreiben. Viel Spaß beim Codieren!
Geschrieben von Rupesh Sharma AKA @hackyrupesh
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3