Python

2015-04-18 5 views
6

İç içe geçmiş bir işleve yapılan çağrıda ek parantezler, Mark Pilgrim'in Dive Into Python Kitabının 6. modülündeki modülünü inceliyorum ve bu kod return [getFileInfoClass(f)(f) for f in fileList]'un yaptıklarına şaşırdım. getFileInfo yuvalanmış bir işlev ve yinelenen (f), ekstra parantez için ne olduğunu merak ediyordum. Birinin bana yardımcı olabileceğini umuyordum. İşte tam fonksiyon bulunuyor:Python

def listDirectory(directory, fileExtList): 
    "get list of file info objects for files of particular extensions" 
    fileList = [os.path.normcase(f) for f in os.listdir(directory)] 
    fileList = [os.path.join(directory, f) for f in fileList \ 
       if os.path.splitext(f)[1] in fileExtList] 
    def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): 
     "get file info class from filename extension" 
     subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] 
     return hasattr(module, subclass) and getattr(module, subclass) or FileInfo 
    return [getFileInfoClass(f)(f) for f in fileList] 
+1

Bu girinti bozuk görünüyor. Lütfen kodu girintisiz bir şekilde yapıştırmayı deneyin, tümünü seçin, ardından düzenleyici araç çubuğundaki '{}' düğmesine basın. –

+1

Sanırım dönüştr (modül, alt sınıf) ve getattr (modül, alt sınıf) ya da FileInfo ''geri dönüş getattr (modül, alt sınıf, FileInfo) olarak yeniden yazılabilir. Sorunuza cevap vermek için 'getFileInfoClass (f) ', daha sonra tek bir argümanla örneklenen bir sınıf döndürüyor gibi görünmektedir, f. Yani yaptığınız her dosya için bir sınıfın örneklerinin bir listesini oluşturmaktır. – Shashank

+0

Bu, sorumu yanıtladı. Teşekkürler. – user3243986

cevap

7

getFileInfoClass bir class döndürür; Daha sonra sınıflar kendilerini geçebilir - sadece bir isim ile class çağıran bir örneği döndürür. Hızlı arka arkaya iki çift parens sadece kısadır. Bu etkili olduğu:

Genellikle
file_info_class = getFileInfoClass(f) 
file_info_instance = file_info_class(f) 

değil çok okunabilir olduğu gibi, böyle Pars iki çift şüpheli karar muhtemelen, ama kişiye, onu izin çünkü yazar makul sayılır ben bu durumda herhalde her şeyi tek bir liste anlama içine koy.

3

getFileInfoClass bir sınıf döndürür, bu yüzden getFileInfoClass(f) bir sınıftır. Bir sınıf adını aldığınızda ve parantez yazdıktan sonra, bir kurucu çağırırsınız.

FileInfo nesnelerinin bir listesini yapar.