2015-04-18 9 views
6

Sto studiando il modulo di Dive Into Python Book di Mark Pilgrim nel capitolo 6, e sono un po 'bloccato con ciò che fa questa riga di codice return [getFileInfoClass(f)(f) for f in fileList]. getFileInfo è una funzione annidata e mi chiedevo qual è il duplicato (f), le parentesi extra servono per. Speravo che qualcuno potesse darmi una mano. Ecco la funzione completa:Una parentesi aggiuntiva in una chiamata a una funzione nidificata in 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

Quella rientranza sembra rotta. Prova ad incollare il codice senza alcun rientro, seleziona tutto, quindi premi il tasto '{}' nella barra degli strumenti dell'editor. –

+1

Penso che 'return hasattr (module, subclass) e getattr (module, subclass) o FileInfo' possano essere riscritti come' return getattr (module, subclass, FileInfo) '. Per rispondere alla tua domanda, 'getFileInfoClass (f)' sembra restituire una classe che viene quindi istanziata con un singolo argomento, f. Quindi quello che stai facendo è creare un elenco di istanze di alcune classi per ogni file. – Shashank

+0

Questo ha risposto alla mia domanda. Grazie. – user3243986

risposta

7

getFileInfoClass restituisce un class; le classi sono quindi chiamabili da sole - chiamando un numero class solo con un nome si restituisce un'istanza di esso. Le due coppie di parentesi in rapida successione sono solo una scorciatoia. E 'efficace:

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

In generale, le due coppie di parentesi come quella è probabilmente una decisione discutibile, in quanto non è molto leggibile, ma suppongo che in questo caso lo scrittore ha ritenuto ragionevole, perché lui o lei ha permesso di Metti tutto dentro una sola lista di comprensione.

3

getFileInfoClass restituisce una classe, in modo getFileInfoClass(f) è una classe. Quando si prende un nome di classe e si scrive parentesi dopo, si chiama un costruttore.

Quindi, [getFileInfoClass(f)(f) for f in fileList] crea un elenco di oggetti FileInfo.

Problemi correlati