Designentscheidung erneut überdenken

PythonPythonBeginner
Jetzt üben

This tutorial is from open-source community. Access the source code

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Abschnitt betrachten wir erneut eine früher getroffene Designentscheidung.

Dies ist ein Guided Lab, das schrittweise Anweisungen bietet, um Ihnen beim Lernen und Üben zu helfen. Befolgen Sie die Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Labor der Stufe Anfänger mit einer Abschlussquote von 83% ist. Es hat eine positive Bewertungsrate von 100% von den Lernenden erhalten.

Dateinamen versus Iterierbare

Vergleichen Sie diese beiden Programme, die das gleiche Ergebnis liefern.

## Geben Sie einen Dateinamen an
def read_data(filename):
    records = []
    with open(filename) as f:
        for line in f:
         ...
            records.append(r)
    return records

d = read_data('file.csv')
## Geben Sie Zeilen an
def read_data(lines):
    records = []
    for line in lines:
     ...
        records.append(r)
    return records

with open('file.csv') as f:
    d = read_data(f)
  • Welche dieser Funktionen bevorzugen Sie? Warum?
  • Welche dieser Funktionen ist flexibler?

Tiefes Konzept: "Duck Typing"

Duck Typing ist ein Begriff der Computerprogrammierung, um zu bestimmen, ob ein Objekt für einen bestimmten Zweck verwendet werden kann. Es ist eine Anwendung des Entenprüfungsverfahrens.

Wenn es wie eine Ente aussieht, schwimmt wie eine Ente und quakt wie eine Ente, dann ist es wahrscheinlich eine Ente.

In der zweiten Version von read_data() oben erwartet die Funktion jedes iterierbare Objekt. Nicht nur die Zeilen einer Datei.

def read_data(lines):
    records = []
    for line in lines:
     ...
        records.append(r)
    return records

Das bedeutet, dass wir es mit anderen Zeilen verwenden können.

## Eine CSV-Datei
lines = open('data.csv')
data = read_data(lines)

## Eine komprimierte Datei
lines = gzip.open('data.csv.gz','rt')
data = read_data(lines)

## Die Standard-Eingabe
lines = sys.stdin
data = read_data(lines)

## Eine Liste von Zeichenketten
lines = ['ACME,50,91.1','IBM,75,123.45',...]
data = read_data(lines)

Diese Designentscheidung bietet beträchtliche Flexibilität.

Frage: Sollten wir uns dieser Flexibilität annähern oder dagegen kämpfen?

Best Practices für die Bibliothekendesign

Codebibliotheken profitieren oft von der Akzeptanz von Flexibilität. Begrenzen Sie Ihre Optionen nicht. Mit großer Flexibilität kommt große Macht.

Übung 3.17: Von Dateinamen zu dateilichen Objekten

Sie haben jetzt eine Datei fileparse.py erstellt, die eine Funktion parse_csv() enthielt. Die Funktion funktionierte wie folgt:

>>> import fileparse
>>> portfolio = fileparse.parse_csv('portfolio.csv', types=[str,int,float])
>>>

Derzeit erwartet die Funktion, dass ihr ein Dateiname übergeben wird. Sie können den Code jedoch flexibler gestalten. Ändern Sie die Funktion so, dass sie mit jedem dateilichen/iterierbaren Objekt funktioniert. Beispielsweise:

>>> import fileparse
>>> import gzip
>>> with gzip.open('portfolio.csv.gz', 'rt') as file:
...      port = fileparse.parse_csv(file, types=[str,int,float])
...
>>> lines = ['name,shares,price', 'AA,100,34.23', 'IBM,50,91.1', 'HPE,75,45.1']
>>> port = fileparse.parse_csv(lines, types=[str,int,float])
>>>

In diesem neuen Code passiert, wenn Sie wie zuvor einen Dateinamen übergeben?

>>> port = fileparse.parse_csv('portfolio.csv', types=[str,int,float])
>>> port
... schauen Sie sich die Ausgabe an (es sollte etwas verrückt sein)...
>>>

Ja, Sie müssen vorsichtig sein. Können Sie eine Sicherheitsüberprüfung hinzufügen, um dies zu vermeiden?

✨ Lösung prüfen und üben

Übung 3.18: Fehlerbehebung in bestehenden Funktionen

Reparieren Sie die Funktionen read_portfolio() und read_prices() in der Datei report.py, sodass sie mit der modifizierten Version von parse_csv() funktionieren. Dies sollte nur eine geringfügige Änderung erfordern. Danach sollten Ihre Programme report.py und pcost.py genauso funktionieren wie bisher.

✨ Lösung prüfen und üben

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Design-Diskussionslabor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.