2015-01-15 23 views
14

如果我在腳本中使用argparse和if __name__ == '__main__'測試,我還想將其用作模塊,那麼應該在該測試下導入argparse,然後初始化它嗎?我沒有發現在腳本中使用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__'塊內,如果只在該塊內引用​​,則可以。顯然,如果你的模塊被另一個模塊導入,那麼該模塊內的代碼將不會運行,因此模塊必須爲main(可能使用它自己的ArgumentParser實例)提供它自己的參數。

+0

這很有道理。這'如果名稱'測試會阻止任何不必要的模塊被導入(可能會節省一些系統資源)。只要它不冒犯任何風格慣例導入模塊在底部,這就是我將與之合作。 – Daniel

+0

就我個人而言,我同意BrenBarn認爲把它們全部放在頂部是一種更好的方法,但它會以任何方式工作。更多討論[here](http://stackoverflow.com/questions/128478/should-python-import-statements-always-be-at-the-top-of-a-module)。 – 101

相關問題