Hakkında ördek yazarak :
Ördek yazmaya, yöntem ve işlev gövdelerindeki bağımsız değişken türlerini alışkanlık olarak sınamayarak, belgelere, açık koda ve doğru kullanımı sağlamak için sınanmaya dayanarak yardım edilir.
Argüman validasyonu hakkında (EAFP: Bağışlama izni istemekten daha kolaydır). Buradan uyarlanmış bir örnek :
... daha pitonik olduğu düşünülüyor:
def my_method(self, key):
try:
value = self.a_dict[member]
except TypeError:
# do something else
Bu, kodunuzu kullanan herkesin gerçek bir sözlük veya alt sınıf kullanması gerekmediği anlamına gelir - eşleme arabirimini uygulayan herhangi bir nesneyi kullanabilirler.
Ne yazık ki pratikte bu kadar basit değil. Yukarıdaki örnekteki üye bir tam sayı olabilirse ne olur? Tamsayılar değişmezdir, bu yüzden bunları sözlük anahtarı olarak kullanmak son derece mantıklıdır. Bununla birlikte, sıra tipi nesneleri indekslemek için de kullanılırlar. Üye bir tamsayı olursa, ikinci örnek, sözlüklerin yanı sıra listeler ve dizeler aracılığıyla da izin verebilir.
Hakkında iddialı programlama:
İddialar, bir programın dahili durumunun, programcı tarafından beklendiği gibi, hataları yakalamak amacıyla kontrol edilmesinin sistematik bir yoludur. Özellikle, kod yazılırken yapılan yanlış varsayımları yakalamak veya başka bir programcı tarafından bir arabirimi kötüye kullanmak için iyidirler. Buna ek olarak, programcının varsayımlarını açıkça göstererek bir dereceye kadar hat içi dokümantasyon görevi görebilirler. ("Açık, örtük olmaktan iyidir.")
Bahsedilen kavramlar bazen çatışıyor, bu yüzden herhangi bir veri doğrulaması yapmıyorum, güçlü doğrulama veya ekleme yaparsanız seçerken aşağıdaki faktörlere güveniyorum:
Güçlü doğrulama. Güçlü doğrulama ile, özel bir İstisna oluşturmak (
ApiError
örneğin) demek istiyorum . İşlevim / yöntemim genel bir API'nın parçasıysa, beklenmedik tür hakkında iyi bir hata iletisi göstermek için bağımsız değişkeni doğrulamak daha iyidir. Türü kontrol ederek sadece kullanmak demek değilisinstance
, aynı zamanda geçilen nesne gerekli arayüzü destekliyorsa (ördek yazarak). API'yi belgeleyip beklenen türü belirtirken kullanıcı işlevimi beklenmedik bir şekilde kullanmak isteyebilir, ancak varsayımları kontrol ettiğimde daha güvende hissediyorum. Genellikle kullanırımisinstance
ve daha sonra diğer türleri veya ördekleri desteklemek istersem, doğrulama mantığını değiştiririm.İddialı programlama. Kodum yeni ise, ben çok ekler kullanın. Bu konudaki tavsiyeleriniz neler? Daha sonra koddaki ekleri kaldırır mısınız?
Eğer benim fonksiyonum / metodum bir API'nin bir parçası değilse de, benim argümanlarımızdan bazılarını yazılmamış, incelenmemiş veya benim tarafımdan test edilmemiş başka bir koda geçirirse, çağrılan arayüze göre çok fazla varsayım yaparım. Bunun arkasındaki mantığım - kodumda daha iyi başarısız olur, daha sonra bir yerde 10 kat daha derin ve çok fazla hata ayıklamak ve daha sonra yine de koduma iddia eklemek için zorlar anlaşılmaz bir hata ile stacktrace derin.
Tür / değer doğrulamasının ne zaman kullanılacağına veya kullanılamayacağına ilişkin yorum ve öneriler, iddia ediyor mu? Sorunun en iyi formülasyonu için üzgünüm.
Örneğin, Customer
SQLAlchemy bildirim modelinin bulunduğu aşağıdaki işlevi göz önünde bulundurun :
def add_customer(self, customer):
"""Save new customer into the database.
@param customer: Customer instance, whose id is None
@return: merged into global session customer
"""
# no validation here at all
# let's hope SQLAlchemy session will break if `customer` is not a model instance
customer = self.session.add(customer)
self.session.commit()
return customer
Dolayısıyla, doğrulamayı ele almanın birkaç yolu vardır:
def add_customer(self, customer):
# this is an API method, so let's validate the input
if not isinstance(customer, Customer):
raise ApiError('Invalid type')
if customer.id is not None:
raise ApiError('id should be None')
customer = self.session.add(customer)
self.session.commit()
return customer
veya
def add_customer(self, customer):
# this is an internal method, but i want to be sure
# that it's a customer model instance
assert isinstance(customer, Customer), 'Achtung!'
assert customer.id is None
customer = self.session.add(customer)
self.session.commit()
return customer
Bunların her birini ördek yazma, tip kontrolü, veri doğrulama bağlamında ne zaman ve neden kullanacaksınız?