web-dev-qa-db-ja.com

Python:__name__ == '__main__'の場合、Argparse Afterをインポートして初期化しますか?

モジュールとしても使用したいスクリプトでargparseとif __name__ == '__main__'テストを使用している場合、そのテストでargparseをインポートしてから初期化する必要がありますか?スクリプトでargparseを使用することについて言及したスタイルガイドはどれもありません。また、argparseスクリプトの多くの例では、「if name」テストを使用したり、異なる方法で使用したりしません。これまで私がこれまで行ってきたことは次のとおりです。

#! /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をインポートし、代わりにスクリプトの本文で構成する必要がありますか?

29
Daniel

インポートを一番上に配置しますが、それを使用するコードは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を使用しない場合でもインポートすると、パフォーマンスへの影響は無視できます。

34
BrenBarn

argparseがそのブロック内でのみ参照される場合は、import argparseブロック内にif __name__ == '__main__'を配置しても問題ありません。モジュールが別のモジュールによってインポートされた場合、明らかにそのブロック内のコードは実行されません。そのため、そのモジュールはmainの独自の引数を提供する必要があります(おそらくArgumentParserの独自のインスタンスを使用) 。

5
101