【问题标题】:Python: Import And Initialize Argparse After if __name__ == '__main__'?Python:如果 __name__ == '__main__' 后导入并初始化 Argparse?
【发布时间】:2015-03-13 11:43:30
【问题描述】:

如果我在脚本中使用 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 和我的其他模块并在脚本正文中配置它吗?

【问题讨论】:

    标签: python scripting


    【解决方案1】:

    我会将导入放在顶部,但将使用它的代码留在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 也导入它对性能的影响可以忽略不计。

    【讨论】:

    • PEP 8 确实建议在文件顶部导入所有模块。我假设使用入口点测试的脚本也不例外。
    【解决方案2】:

    如果argparse 仅在该块中引用,则可以将import argparse 放在if __name__ == '__main__' 块中。显然,如果您的模块由另一个模块导入,则该块中的代码将不会运行,因此该模块必须为main 提供它自己的参数(可能使用它自己的ArgumentParser 实例)。

    【讨论】:

    • 这是有道理的。 'if name' 测试会阻止导入任何不必要的模块(可能会节省一些系统资源)。只要在底部导入模块不违反任何样式约定,我就会这样做。
    • 我个人同意 BrenBarn 的观点,将它们都放在顶部会更好bit,但无论哪种方式都可以。更多讨论here.
    猜你喜欢
    • 2018-03-13
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 2021-08-25
    • 2020-06-05
    • 2015-09-12
    • 2017-07-03
    相关资源
    最近更新 更多