2015-01-15 9 views
14

argparseとif __name__ == '__main__'テストをスクリプトで使用していて、モジュールとして使用したい場合は、そのテストの下でargparseをインポートしてから初期化する必要がありますか?スクリプトでargparseを使用しているスタイルガイドと、argparseスクリプトの多くの例では、 'if name'テストを使用したり、別の方法で使用したりしていませんでした。ここで私はこれまで一緒に行くされていているもの:Python:__name__ == '__main__'の場合は、Argparseをインポートして初期化しますか?

#! /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

​​がそのブロック内でのみ参照されている場合は、if __name__ == '__main__'ブロック内にimport 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

関連する問題