Python'da "EAFP prensibini kullanma" ile kastedilen nedir? Herhangi bir örnek verebilir misiniz?
Python'da "EAFP prensibini kullanma" ile kastedilen nedir? Herhangi bir örnek verebilir misiniz?
Yanıtlar:
Gönderen sözlüğü :
Affetmek, izin vermekten daha kolaydır. Bu yaygın Python kodlama stili, geçerli anahtarların veya niteliklerin varlığını varsayar ve varsayımın yanlış olduğunu kanıtlarsa istisnaları yakalar. Bu temiz ve hızlı stil, birçok
try
veexcept
ifadenin varlığı ile karakterizedir . Teknik , C gibi diğer birçok dilde ortak olan LBYL stiliyle zıttır .
Bir örnek, bir sözlük anahtarına erişme girişimidir.
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
LBYL sürümü sözlüğün içindeki anahtarı iki kez aramalıdır ve ayrıca biraz daha az okunabilir olarak değerlendirilebilir.
x
anahtar yoksa zaman: x = mydict.get('key')
dönecektir None
eğer 'key'
değil my_dict
; siz de yapabilirsiniz .get('key', <something>)
ve sonra anahtar sözlükte değilse x'e bir şey atanacaktır. dict.setdefault()
ve collections.defaultdict
fazla koddan kaçınmak için güzel şeyler.
except KeyError
sıra sıra AttributeError
basit ama en kötü örneklerden bazılarıdır. Çoğu zaman bir şey hata ayıklama sıkışmıştı çünkü except AttributeError
yanlış yere konuldu, bu da zincirde daha derinlere doğru yanlış özellik hatası yakaladı. Bence iyi örnekler şunlardır: try: open() ... except: IOError
. Veyatry: parseLine() ... except ParseError
Başka bir örnekle açıklamaya çalışacağım.
Burada dosyaya erişmeye ve içeriği konsolda yazdırmaya çalışıyoruz.
Dosyaya erişip erişemeyeceğimizi kontrol etmek isteyebiliriz ve eğer yapabilirsek, dosyayı açıp içeriği yazdıracağız. Dosyaya erişemezsek, else
parçayı vuracağız . Bunun bir yarış koşulu olmasının nedeni, öncelikle bir erişim kontrolü yapmamızdır. Ulaştığımız zaman with open(my_file) as f:
, bazı izin sorunları nedeniyle artık erişemiyoruz (örneğin, başka bir işlem özel bir dosya kilidi kazanıyor). Bu kod büyük olasılıkla bir hata verir ve dosyaya erişebileceğimizi düşündüğümüz için bu hatayı yakalayamayız.
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")
Bu örnekte, sadece dosyayı açmaya çalışıyoruz ve dosyayı açamıyorsak, bir dosya atar IOError
. Eğer yapabilirsek, dosyayı açıp içindekileri yazdıracağız. Yani bir şey sormak yerine yapmaya çalışıyoruz . Çalışırsa harika! Eğer değilse, hatayı yakalayıp hallederiz.
# # No race condition
try:
f = open(my_file)
except IOError as e:
print("File can't be accessed")
else:
with f:
print(f.read())
Ben buna "iyimser programlama" diyorum. Fikir, çoğu zaman insanların doğru şeyi yapacağı ve hataların az olması gerektiğidir. Bu yüzden önce "doğru olanın" gerçekleşmesini kodlayın ve sonra yapmazsanız hataları yakalayın.
Benim düşüncem, eğer bir kullanıcı hata yapacaksa, zamanın sonuçlarından muzdarip olması gerekir. Aracı doğru şekilde kullanan kişiler hızlandırılır.