2015-01-15 12 views
14

Jeśli używam argparse i testu if __name__ == '__main__' w skrypcie, który chciałbym również użyć jako modułu, czy powinienem zaimportować argparse w ramach tego testu, a następnie zainicjować go? Żaden z przewodników stylów, które znalazłem, nie wspomina o użyciu argparse w skryptach i wielu przykładach skryptów argparse nie używa testu "if name" lub używa go inaczej. Oto co ja jeździmy z dotychczas:Python: Importuj i uruchom Argparse After, jeśli __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) 

powinienem importować argparse z moich innych modułów na górze i skonfigurować go w organizmie skryptu zamiast?

Odpowiedz

14

chciałbym umieścić import na górze, ale pozostawić kod, który używa go wewnątrz bloku 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) 

Umieszczenie przywozu na górze wyjaśnia, jakie moduły używa modułu. Importowanie argpase nawet wtedy, gdy jej nie używasz, będzie miało znikomy wpływ na wydajność.

+2

[PEP 8] (https://www.python.org/dev/peps/pep-0008/#imports) zaleca importowanie wszystkich modułów na górze pliku. Zakładam, że nie ma wyjątków dla skryptów używających testu punktu wejścia. – Daniel

2

Można wstawić import argparse w bloku if __name__ == '__main__', jeśli argparse odnosi się tylko do tego bloku. Oczywiście kod w tym bloku nie będzie działał, jeśli twój moduł zostanie zaimportowany przez inny moduł, więc moduł będzie musiał podać własny argument dla main (prawdopodobnie używając własnej instancji ArgumentParser).

+0

To ma sens. Test "jeśli nazwa" uniemożliwiłby importowanie niepotrzebnych modułów (prawdopodobnie oszczędzając niektóre zasoby systemowe). Tak długo, jak nie obraża żadnych konwencji stylu importowania modułów na samym dole, to jest to, z czym będę się zgadzał. – Daniel

+0

Osobiście zgadzam się z BrenBarnem, że jest o wiele ładniejsze, aby mieć je u góry, ale działałoby to w każdy sposób. Więcej dyskusji [tutaj] (http://stackoverflow.com/questions/128478/should-python-import-statements-always-be-at-the-top-a-module). – 101

Powiązane problemy