Python:在主程序和 PEP 8 开头导入

Posted

技术标签:

【中文标题】Python:在主程序和 PEP 8 开头导入【英文标题】:Python: imports at the beginning of the main program & PEP 8 【发布时间】:2010-12-06 14:46:30 【问题描述】:

PEP 8 建议在程序开头导入模块。

现在,我觉得在 main 程序的开头(即在if __name__ == '__main__' 之后)导入其中的一些是有意义的。例如,如果主程序从命令行读取参数,我倾向于在 main 程序的开头使用import sys:这样,sys 在代码用作模块,因为在这种情况下不需要命令行参数访问。

这对 PEP 8 的侵犯有多严重?我应该避免这样做吗?还是修改 PEP 8 是否合理?

【问题讨论】:

optparse 可用于命令行解析,比使用 sys.argv 和自己解析更好。 相关:***.com/questions/1024049/… @monkut:如果您不使用命令行options(即,当您只需要处理没有选项的命令行参数时),optparse 并不是特别有用。 您不能“侵犯”PEP8,因为它不是规则。这只是为您提供良好起点的建议。例如,我经常编写每个缩进级别有两个空格的 Python 代码。这不是非法的,不会混合制表符和空格,而且它仍然很清晰。但这不是 PEP 8 的建议。 【参考方案1】:

我真的无法告诉你这样做有多糟糕。

但是,通过仅在首次使用时导入某些库,我大大提高了 Web 应用程序的性能(响应时间、负载)。

顺便说一句,以下内容也来自 PEP 8:

但最重要的是:知道何时 不一致——有时风格 指南只是不适用。当在 怀疑,用你最好的判断。看 在其他示例中并决定什么 看起来最好。不要犹豫 问!

【讨论】:

如果你真的担心,你可能想看看 demandimport:hg.intevation.org/mercurial/crew/file/tip/mercurial/… 我看不出它对响应时间有何帮助。确定启动时间 @gnibbler:它的作用就像 import 只在第一次使用时发生一样,所以如果它有助于 Prody 的响应时间,demandimport 将以同样的方式提供帮助。【参考方案2】:

总的来说,我认为延迟导入可能不需要的模块并没有太大的危害。

但是sys 我肯定会提前导入,在顶部。这是一个非常常见的模块,您很可能会在脚本的其他地方使用 sys 而不会注意到它并不总是被导入。 sys 也是总是由 Python 本身加载的模块之一,因此您不会通过避免导入来节省任何模块启动时间(反正 sys 启动并不多)。

【讨论】:

【参考方案3】:

当 PEP 中没有关于您的担忧时,我建议您做您认为最合适的事情。

【讨论】:

【参考方案4】:

导入 sys 并不需要那么长时间,我会担心它。但是,某些模块确实需要更长的时间。 我认为 sys 并没有真正阻塞命名空间。无论如何,我都不会使用名为 sys 的变量或类。

如果您认为将其置于顶部的弊大于利,请务必随心所欲。 PEP 8 只是一个指导方针,您看到的许多代码并不符合它。

【讨论】:

【参考方案5】:

问题不在于性能。

问题在于清晰度。

您的“主”程序今天只是一个主程序。明天,它可能是某个更高级别的主程序中包含的库。稍后,它将只是更大包装中的一个模块。

由于您的“主”程序的生命可能会改变,您有两个响应。

    隔离if __name__ == "__main__" 中的“主要”事物。这不是对 PEP-8 的荒谬违反。这是一种合理的打包方式。

    尝试限制“主”程序脚本中的功能数量。尝试将它们降低到 imports 和 if __name__ == "__main__" 的东西。如果您的主脚本很小,那么您的导入问题就会消失。

【讨论】:

以上是关于Python:在主程序和 PEP 8 开头导入的主要内容,如果未能解决你的问题,请参考以下文章

错误记录PyCharm 运行 Python 程序报错 ( PEP 8: E402 module level import not at top of file )

错误记录PyCharm 运行 Python 程序报错 ( PEP 8: E402 module level import not at top of file )

PEP 8 -- Python代码格式规则

python导入自定义模块

Python编写规则值得收藏

Python 类的私有属性和 name mangling