2014-12-19 8 views
5

operator, bir nesneyi bir nesneden alan bir işlev oluşturmak için attrgetter sağlar.Neden python'un bir tutuculuğu yoktur (ve bunu yapmak için ne gerekir)?

Neden bu, operator (veya standart kitaplıklarda başka bir yerde) içinde yer almıyor?

def attrsetter(name): 
    def setter(obj, val): 
     setattr(obj, name, val) 
    return setter 

Düşünebildiğim tek nedeni, bu basit yaklaşımın kırılacağı kenar durumları olmasıdır. Bu durumda, bu kenar kutuları nelerdir, böylece onları tuzağa düşürmeyi/bunlardan kaçınmayı deneyebilirim?

+0

'itemsetter' de eksik. Bahse girerim, getter meslektaşları kadar kullanışlı olmadığından, onu eklemediler. – Bakuriu

+0

Belki de pek çok kullanım örneği görmüyorlar. Normal olarak, bu operatörler bir değer döndürür, böylece fonksiyonel olarak kullanılabilirler, örn. 'map',' filter' vb. ile ayarlanması, bir şeylerin ayarlanması genellikle 'None' değerini döndürür. –

+1

Ayrıca, 'attrgetter' daha fazla nitelik ve noktalı isme izin veren süslü şeyler sağladığından, muhtemelen birden çok niteliği noktalı isimlerle ayarlayabilen simetrik bir düzen oluşturmak isteyebilirsiniz. – Bakuriu

cevap

6

attrgetter, lambda yerine bir işlevin gerekli olduğu yerlerde kullanılmak üzere tasarlanmıştır. Örneğin:

# equivalent 
heads = map(attrgetter('head'), objs) 
heads = map(lambda o: o.head, objs) 

Diğer bir deyişle, attrgetter noktası faydalı bir değeri veren bir yan etki içermeyen fonksiyon oluşturmaktır ve bu, bir işlevi gerektiren ifadelerde kullanılabilir. Diğer yandan, bir attrsetter, yalnızca yan etkiyle çalışır ve Python sözleşmesi ile None'u geri göndermesi gerekir. attrsetter, map numaralı argümanın tamamı için kullanışlı olmayacağından ve benzeri olmadığından, bu özellik sağlanmamıştır. attrsetter'a ihtiyacınız varsa, normal bir for döngüsünü yazmanız yeterlidir.

Ayrıca yukarıdaki deyimler hem daha iyi bir liste anlayışı ile ifade edilir unutmayın:

heads = [o.head for o in objs] 

attrgetter nadiren gereklidir ve bunun lambda Python kaldırılır olmayacak açıklandı kez çekiciliğinden çok kaybetti 3 sonuçta.

İlgili konular