„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > (Ython-Fehler, mit denen jeder Entwickler immer noch konfrontiert ist, und wie man sie behebt)

(Ython-Fehler, mit denen jeder Entwickler immer noch konfrontiert ist, und wie man sie behebt)

Veröffentlicht am 31.10.2024
Durchsuche:889

ython bugs that every developer is still facing in and how to fix them)

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.


1. Veränderliche Standardargumente: Eine stille Falle

Das Problem

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.

Beispiel

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!

Die Lösung

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]

Referenzen

  • Pythons Standardargument gotcha

2. Der schwer fassbare Schlüsselfehler in Wörterbüchern

Das Problem

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.

Beispiel

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'

Die Lösung

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

Referenzen

  • Python KeyError und wie man damit umgeht

3. Stille Fehler mit Try-Exception-Überbeanspruchung

Das Problem

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.

Beispiel

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.

Die Lösung

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}")

Referenzen

  • Pythons Try-Except-Best Practices

4. Ganzzahldivision: Die Falle der Kürzung

Das Problem

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.

Beispiel

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2

Die Lösung

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

Referenzen

  • Python Division: / vs //

5. Speicherlecks mit Zirkelverweisen

Das Problem

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.

Beispiel

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

Die Lösung

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

Referenzen

  • Python-Speicherverwaltung und Garbage Collection

Abschluss

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

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/hackyrupesh/5-python-bugs-that-every-developer-is-still-facing-in-2024-and-how-to-fix-them-5f4p? 1 as Wenn es einen Verstoß gibt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

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