Einführung
In diesem Abschnitt betrachten wir erneut eine früher getroffene Designentscheidung.
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
In diesem Abschnitt betrachten wir erneut eine früher getroffene Designentscheidung.
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)
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?
Codebibliotheken profitieren oft von der Akzeptanz von Flexibilität. Begrenzen Sie Ihre Optionen nicht. Mit großer Flexibilität kommt große Macht.
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?
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.
Herzlichen Glückwunsch! Sie haben das Design-Diskussionslabor abgeschlossen. Sie können in LabEx weitere Labs absolvieren, um Ihre Fähigkeiten zu verbessern.