Was bedeutet "Verwenden des EAFP-Prinzips" in Python? Können Sie Beispiele nennen?
Was bedeutet "Verwenden des EAFP-Prinzips" in Python? Können Sie Beispiele nennen?
Antworten:
Aus dem Glossar :
Es ist einfacher, um Vergebung zu bitten als um Erlaubnis. Dieser übliche Python-Codierungsstil setzt die Existenz gültiger Schlüssel oder Attribute voraus und fängt Ausnahmen ab, wenn sich die Annahme als falsch herausstellt. Dieser klare und schnelle Stil zeichnet sich durch das Vorhandensein vieler
try
undexcept
Aussagen aus. Die Technik steht im Gegensatz zum LBYL-Stil , der vielen anderen Sprachen wie C gemeinsam ist.
Ein Beispiel wäre ein Versuch, auf einen Wörterbuchschlüssel zuzugreifen.
EAFP:
try:
x = my_dict["key"]
except KeyError:
# handle missing key
LBYL:
if "key" in my_dict:
x = my_dict["key"]
else:
# handle missing key
Die LBYL-Version muss den Schlüssel im Wörterbuch zweimal durchsuchen und wird möglicherweise auch als etwas weniger lesbar angesehen.
x
wenn der Schlüssel nicht vorhanden ist: x = mydict.get('key')
Wird zurückgegeben, None
wenn 'key'
nicht in my_dict
; Sie können dies auch tun .get('key', <something>)
, und dann wird x das zugewiesen, wenn der Schlüssel nicht im Wörterbuch enthalten ist. dict.setdefault()
und collections.defaultdict
sind nette Dinge, um auch überschüssigen Code zu vermeiden.
except KeyError
so gut wie AttributeError
einfach, aber einige der schlimmsten Beispiele. So oft steckte ich beim Debuggen fest, weil except AttributeError
es an einer falschen Stelle platziert wurde, was dazu führte, dass falsche Attributfehler aufgefangen wurden, die tiefer in der Kette auftauchten. Bessere Beispiele, denke ich, sind : try: open() ... except: IOError
. Odertry: parseLine() ... except ParseError
Ich werde versuchen, es mit einem anderen Beispiel zu erklären.
Hier versuchen wir, auf die Datei zuzugreifen und den Inhalt in der Konsole zu drucken.
Wir möchten möglicherweise überprüfen, ob wir auf die Datei zugreifen können, und wenn wir können, öffnen wir sie und drucken den Inhalt. Wenn wir nicht auf die Datei zugreifen können, treffen wir das else
Teil. Der Grund, warum dies eine Rennbedingung ist, ist, dass wir zuerst eine Zugangsprüfung durchführen. Bis wir es erreichen with open(my_file) as f:
, können wir möglicherweise aufgrund einiger Berechtigungsprobleme nicht mehr darauf zugreifen (z. B. erhält ein anderer Prozess eine exklusive Dateisperre). Dieser Code wird wahrscheinlich einen Fehler auslösen und wir können diesen Fehler nicht abfangen, da wir dachten, wir könnten auf die Datei zugreifen.
import os
my_file = "/path/to/my/file.txt"
# Race condition
if os.access(my_file, os.R_OK):
with open(my_file) as f:
print(f.read())
else:
print("File can't be accessed")
In diesem Beispiel versuchen wir nur, die Datei zu öffnen. Wenn wir sie nicht öffnen können, wird eine Datei ausgegeben IOError
. Wenn wir können, öffnen wir die Datei und drucken den Inhalt. Anstatt etwas zu fragen , versuchen wir es zu tun. Wenn es funktioniert, großartig! Wenn dies nicht der Fall ist, erfassen wir den Fehler und behandeln ihn.
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
Ich nenne es "optimistische Programmierung". Die Idee ist, dass die meisten Leute das Richtige tun und es nur wenige Fehler geben sollte. Codieren Sie also zuerst, damit das "Richtige" passiert, und fangen Sie dann die Fehler ab, wenn dies nicht der Fall ist.
Ich habe das Gefühl, wenn ein Benutzer Fehler macht, sollte er derjenige sein, der unter den zeitlichen Konsequenzen leidet. Menschen, die das Werkzeug richtig einsetzen, werden durchgeschleudert.