2015-01-15 3 views
14

Если я использую argparse и тест if __name__ == '__main__' в сценарии, который я также хотел бы использовать в качестве модуля, должен ли я импортировать argparse под этим тестом, а затем инициализировать его? Ни один из руководств по стилям, которые я нашел, не упоминает использование скрипта в скриптах, и многие примеры сценариев argparse не используют тест «if name» или используют его по-разному. Вот что я шел с до сих пор:Python: Импортировать и инициализировать Argparse. Если __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) 

Должен ли я импортировать argparse с моими другими модулями в верхней и настроить его в теле сценария вместо этого?

ответ

14

Я бы поставил импорт в верхней части, но оставить код, который использует его внутри 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) 

Выставления импорта в верхних проясняет, какие модули использует ваш модуль. Импорт argpase, даже если вы его не используете, будет иметь незначительное влияние на производительность.

+2

[PEP 8] (https://www.python.org/dev/peps/pep-0008/#imports) рекомендует импортировать все модули в верхней части файла. Я бы предположил, что нет никаких исключений для скриптов, использующих тест точки входа. – Daniel

2

Это нормально, если положить import argparse в блок if __name__ == '__main__', если argparse относится только к этому блоку. Очевидно, что код внутри этого блока не будет запущен, если ваш модуль будет импортирован другим модулем, поэтому модуль должен будет предоставить собственный аргумент для main (возможно, используя собственный экземпляр ArgumentParser).

+0

Это имеет смысл. Тест «если имя» предотвратит импорт любых ненужных модулей (возможно, сбережение некоторых системных ресурсов). До тех пор, пока он не оскорбит любые соглашения о стиле, чтобы импортировать модули внизу, вот что я буду делать. – Daniel

+0

Лично я согласен с BrenBarn в том, что мне нравится больше, но все равно работает. Больше обсуждения [здесь] (http://stackoverflow.com/questions/128478/should-python-import-statements-always-be-at-the-top-of-a-module). – 101

Смежные вопросы