PEP 8建议在程序开始时导入模块。
现在,我觉得在主程序的开头(即 after if __name__ == '__main__'
)导入其中的一些是有意义的。例如,如果主程序从命令行读取参数,我倾向于在主程序import sys
的开头做:这样,当代码用作模块时,不必导入,因为不需要,在这种情况下,用于命令行参数访问。sys
这种对 PEP 8 的侵犯有多严重?我应该避免这样做吗?还是修改 PEP 8 是否合理?
我真的不能告诉你这样做有多糟糕。
但是,通过仅在第一次使用时导入某些库,我极大地提高了 Web 应用程序的性能(响应时间、负载)。
顺便说一句,以下内容也来自 PEP 8:
但最重要的是:知道何时不一致——有时风格指南并不适用。如有疑问,请使用您的最佳判断。查看其他示例并决定什么看起来最好。不要犹豫,问!
一般来说,我认为后期导入可能不需要的模块并没有太大的危害。
但是sys
,我肯定会尽早导入,在顶部。这是一个非常常见的模块,您很可能会在脚本的其他地方使用 sys 而不会注意到它并不总是被导入。sys
也是总是由 Python 本身加载的模块之一,因此您不会通过避免导入来节省任何模块启动时间(无论如何,sys 的启动并不多)。
当 PEP 中没有任何关于您的担忧时,我会建议您做您认为最合适的事情。
导入 sys 并不需要那么长时间,我会担心它。但是,某些模块确实需要更长的时间。我认为 sys 并没有真正阻塞命名空间。无论如何,我都不会使用名为 sys 的变量或类。
如果您认为将其置于顶部弊大于利,那么无论如何都可以随心所欲地去做。PEP 8 只是一个指导方针,您看到的许多代码并不符合它。
问题不在于性能。
问题是清晰度。
您的“主”程序今天只是一个主程序。明天,它可能是某个更高级别的主程序中包含的库。稍后,它将只是更大包装中的一个模块。
由于您的“主要”程序的生命可能会改变,因此您有两个响应。
隔离里面的“主要”东西if __name__ == "__main__"
。这不是对 PEP-8 的荒谬违反。这是一种合理的打包方式。
尝试限制“主”程序脚本中的功能数量。尝试将它们降低到import
s 和其他if __name__ == "__main__"
东西。如果您的主脚本很小,那么您的导入问题就会消失。