2015-01-15 12 views
14

Se sto utilizzando argparse e un test if __name__ == '__main__' in uno script che vorrei utilizzare anche come modulo, dovrei importare argparse con quel test e quindi inizializzarlo? Nessuna delle guide di stile che ho trovato menziona l'uso di argparse negli script e molti esempi di scripting argparse non usano il test 'if name' o lo usano in modo diverso. Ecco quello che mi sono state andando con finora:Python: importa e inizializza Argparse Dopo se __name__ == '__main__'?

#! /usr/bin/env python 

def main(name): 
    print('Hello, %s!' % name) 

if __name__ == '__main__': 
    import argparse 
    parser = argparse.ArgumentParser(description = 'Say hello') 
    parser.add_argument('name', help='your name, enter it') 
    args = parser.parse_args() 

    main(args.name) 

Dovrei importare argparse con i miei altri moduli in alto e configurarlo nel corpo dello script, invece?

risposta

14

vorrei mettere l'importazione in alto, ma lasciare il codice che lo utilizza all'interno del blocco if __name__:

import argparse 

# other code. . . 

def main(name): 
    print('Hello, %s!' % name) 

if __name__ == '__main__': 
    parser = argparse.ArgumentParser(description = 'Say hello') 
    parser.add_argument('name', help='your name, enter it') 
    args = parser.parse_args() 

    main(args.name) 

Mettere le importazioni in cima chiarisce quali moduli usa il modulo. L'importazione di argpase anche quando non la si usa avrà un impatto sulle prestazioni trascurabile.

+2

[PEP 8] (https://www.python.org/dev/peps/pep-0008/#imports) consiglia di importare tutti i moduli nella parte superiore del file. Suppongo che non ci siano eccezioni per gli script che utilizzano il test del punto di ingresso. – Daniel

2

Va bene inserire lonel blocco argparse solo all'interno di tale blocco. Ovviamente il codice all'interno di quel blocco non verrà eseguito se il tuo modulo viene importato da un altro modulo, in modo tale che il modulo debba fornire il proprio argomento per main (possibilmente utilizzando la propria istanza di ArgumentParser).

+0

Questo ha senso. Quel test "se nome" impedirebbe l'importazione di moduli non necessari (probabilmente salvando alcune risorse di sistema). Finché non offende alcuna convenzione di stile per importare i moduli in fondo, è quello che andrò con. – Daniel

+0

Personalmente sono d'accordo con BrenBarn che è un _bit_ nicer averli tutti in cima, ma funzionerebbe in entrambi i modi. Altre discussioni [qui] (http://stackoverflow.com/questions/128478/should-python-import-statements-always-be-at-the-top-of-a-module). – 101

Problemi correlati